+ Module &mod = *M.get();
+
+ // Allocate target machine. First, check whether the user has
+ // explicitly specified an architecture to compile for.
+ TargetMachine* (*TargetMachineAllocator)(const Module&,
+ IntrinsicLowering *) = 0;
+ switch (Arch) {
+ 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 ->
+ // SPARCV9) is kind of gross, but it will work until we have more
+ // sophisticated target information to work from.
+ 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;
+ } else {
+ // 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;
+#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. If no native target is "
+ << "available, use -march=c to emit C code.\n";