X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllc%2Fllc.cpp;h=ed99c1c4080a8e92e83d62f7b5f75e723cd647dd;hb=7c0e022c5c4be4b11e199a53f73bbdd84e34aa80;hp=4d1bb772edf318c532bd587eb74c91f6e85780fb;hpb=5d5bc7b90cd1d2241f468ed5d49c69d53a7e6aaa;p=oota-llvm.git diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 4d1bb772edf..ed99c1c4080 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -1,4 +1,12 @@ //===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// // // This is the llc code generator. // @@ -44,7 +52,8 @@ GetFileNameRoot(const std::string &InputFilename) std::string IFN = InputFilename; std::string outputFilename; int Len = IFN.length(); - if (IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') { + if ((Len > 2) && + IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') { outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/ } else { outputFilename = IFN; @@ -68,9 +77,7 @@ int main(int argc, char **argv) { // Allocate target machine. First, check whether the user has // explicitly specified an architecture to compile for. - unsigned Config = (mod.isLittleEndian() ? TM::LittleEndian : TM::BigEndian)| - (mod.has32BitPointers() ? TM::PtrSize32 : TM::PtrSize64); - TargetMachine* (*TargetMachineAllocator)(unsigned) = 0; + TargetMachine* (*TargetMachineAllocator)(const Module&) = 0; switch (Arch) { case x86: TargetMachineAllocator = allocateX86TargetMachine; @@ -83,16 +90,28 @@ int main(int argc, char **argv) { // the module. This heuristic (ILP32, LE -> IA32; LP64, BE -> // SPARCV9) is kind of gross, but it will work until we have more // sophisticated target information to work from. - if (mod.isLittleEndian() && mod.has32BitPointers()) { + if (mod.getEndianness() == Module::LittleEndian && + mod.getPointerSize() == Module::Pointer32) { TargetMachineAllocator = allocateX86TargetMachine; - } else if (mod.isBigEndian() && mod.has64BitPointers()) { + } else if (mod.getEndianness() == Module::BigEndian && + mod.getPointerSize() == Module::Pointer64) { TargetMachineAllocator = allocateSparcTargetMachine; } else { - assert(0 && "You must specify -march; I could not guess the default"); + // If the module is target independent, favor a target which matches the + // current build system. +#if defined(i386) || defined(__i386__) || defined(__x86__) + TargetMachineAllocator = allocateX86TargetMachine; +#elif defined(sparc) || defined(__sparc__) || defined(__sparcv9) + TargetMachineAllocator = allocateSparcTargetMachine; +#else + std::cerr << argv[0] << ": module does not specify a target to use. " + << "You must use the -march option.\n"; + return 1; +#endif } break; } - std::auto_ptr target((*TargetMachineAllocator)(Config)); + std::auto_ptr target(TargetMachineAllocator(mod)); assert(target.get() && "Could not allocate target machine!"); TargetMachine &Target = *target.get(); const TargetData &TD = Target.getTargetData(); @@ -117,7 +136,7 @@ int main(int argc, char **argv) { } Out = new std::ofstream(OutputFilename.c_str()); - // Make sure that the Out file gets unlink'd from the disk if we get a + // Make sure that the Out file gets unlinked from the disk if we get a // SIGINT RemoveFileOnSignal(OutputFilename); } else { @@ -146,7 +165,7 @@ int main(int argc, char **argv) { return 1; } - // Make sure that the Out file gets unlink'd from the disk if we get a + // Make sure that the Out file gets unlinked from the disk if we get a // SIGINT RemoveFileOnSignal(OutputFilename); }