X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllc%2Fllc.cpp;h=959bdbe36cbec178841434e50e51f5070177db30;hb=1d29a6d6c7a7f6203065c003d3d2d002870e38a1;hp=9673343306782782fda99f2501e0ddcb0272990a;hpb=62c720a5bdd36b85dd497a1c3575db5731eca208;p=oota-llvm.git diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 96733433067..959bdbe36cb 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -1,4 +1,11 @@ //===-- 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. // @@ -16,6 +23,8 @@ #include #include +using namespace llvm; + // General options for llc. Other pass-specific options are specified // within the corresponding llc passes, and target-specific options // and back-end code generation options are specified with the target machine. @@ -28,12 +37,14 @@ OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename")); static cl::opt Force("f", cl::desc("Overwrite output files")); -enum ArchName { noarch, x86, Sparc }; +enum ArchName { noarch, X86, Sparc, PowerPC, CBackend }; static cl::opt Arch("march", cl::desc("Architecture to generate assembly for:"), cl::Prefix, - cl::values(clEnumVal(x86, " IA-32 (Pentium and above)"), - clEnumValN(Sparc, "sparc", " SPARC V9"), + cl::values(clEnumValN(X86, "x86", " IA-32 (Pentium and above)"), + clEnumValN(Sparc, "sparc", " SPARC V9"), + clEnumValN(PowerPC, "powerpc", " PowerPC"), + clEnumValN(CBackend, "c", " C backend"), 0), cl::init(noarch)); @@ -44,7 +55,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,14 +80,21 @@ int main(int argc, char **argv) { // Allocate target machine. First, check whether the user has // explicitly specified an architecture to compile for. - TargetMachine* (*TargetMachineAllocator)(const Module&) = 0; + TargetMachine* (*TargetMachineAllocator)(const Module&, + IntrinsicLowering *) = 0; switch (Arch) { - case x86: + case CBackend: + TargetMachineAllocator = allocateCTargetMachine; + break; + case X86: TargetMachineAllocator = allocateX86TargetMachine; break; case Sparc: TargetMachineAllocator = allocateSparcTargetMachine; break; + case PowerPC: + TargetMachineAllocator = allocatePowerPCTargetMachine; + break; default: // Decide what the default target machine should be, by looking at // the module. This heuristic (ILP32, LE -> IA32; LP64, BE -> @@ -84,6 +103,9 @@ int main(int argc, char **argv) { if (mod.getEndianness() == Module::LittleEndian && mod.getPointerSize() == Module::Pointer32) { TargetMachineAllocator = allocateX86TargetMachine; + } else if (mod.getEndianness() == Module::BigEndian && + mod.getPointerSize() == Module::Pointer32) { + TargetMachineAllocator = allocatePowerPCTargetMachine; } else if (mod.getEndianness() == Module::BigEndian && mod.getPointerSize() == Module::Pointer64) { TargetMachineAllocator = allocateSparcTargetMachine; @@ -94,15 +116,18 @@ int main(int argc, char **argv) { TargetMachineAllocator = allocateX86TargetMachine; #elif defined(sparc) || defined(__sparc__) || defined(__sparcv9) TargetMachineAllocator = allocateSparcTargetMachine; +#elif defined(__POWERPC__) || defined(__ppc__) || defined(__APPLE__) + TargetMachineAllocator = allocatePowerPCTargetMachine; #else std::cerr << argv[0] << ": module does not specify a target to use. " - << "You must use the -march option.\n"; + << "You must use the -march option. If no native target is " + << "available, use -march=c to emit C code.\n"; return 1; #endif } break; } - std::auto_ptr target(TargetMachineAllocator(mod)); + std::auto_ptr target(TargetMachineAllocator(mod, 0)); assert(target.get() && "Could not allocate target machine!"); TargetMachine &Target = *target.get(); const TargetData &TD = Target.getTargetData(); @@ -127,7 +152,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 { @@ -139,7 +164,11 @@ int main(int argc, char **argv) { Out = &std::cout; } else { OutputFilename = GetFileNameRoot(InputFilename); - OutputFilename += ".s"; + + if (Arch != CBackend) + OutputFilename += ".s"; + else + OutputFilename += ".cbe.c"; if (!Force && std::ifstream(OutputFilename.c_str())) { // If force is not specified, make sure not to overwrite a file! @@ -156,7 +185,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); }