Use the new subtarget support to automatically choose the correct ABI
authorNate Begeman <natebegeman@mac.com>
Thu, 4 Aug 2005 20:49:48 +0000 (20:49 +0000)
committerNate Begeman <natebegeman@mac.com>
Thu, 4 Aug 2005 20:49:48 +0000 (20:49 +0000)
and asm printer for PowerPC if one is not specified.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22659 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPC.h
lib/Target/PowerPC/PPC32RegisterInfo.td
lib/Target/PowerPC/PPC64RegisterInfo.cpp
lib/Target/PowerPC/PPC64RegisterInfo.td
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/PowerPC/PPCTargetMachine.cpp

index 2761910670ddf2a997eb0e2bd104bc7673f9b1de..58b0a6fc4177e1929ea4ab33d2112ae093cf7d06 100644 (file)
@@ -22,6 +22,10 @@ namespace llvm {
 class FunctionPass;
 class TargetMachine;
 
+enum PPCTargetEnum {
+  TargetDefault, TargetAIX, TargetDarwin
+};
+
 FunctionPass *createPPCBranchSelectionPass();
 FunctionPass *createPPC32ISelSimple(TargetMachine &TM);
 FunctionPass *createPPC32ISelPattern(TargetMachine &TM);
@@ -31,6 +35,7 @@ FunctionPass *createAIXAsmPrinter(std::ostream &OS, TargetMachine &TM);
 
 extern bool GPOPT;
 extern bool PICEnabled;
+extern PPCTargetEnum PPCTarget;
 } // end namespace llvm;
 
 // GCC #defines PPC on Linux but we use it as our namespace name
index 9536de1aadcedeb204d5cd5f427f29bf6e9a9bc4..c725551d7f6f0033d799647b3eb544a95128ec0b 100644 (file)
@@ -22,7 +22,7 @@ def GPRC : RegisterClass<i32, 32,
 {
   let Methods = [{
     iterator allocation_order_begin(MachineFunction &MF) const {
-      return begin() + (AIX ? 1 : 0);
+      return begin() + ((TargetAIX == PPCTarget) ? 1 : 0);
     }
     iterator allocation_order_end(MachineFunction &MF) const {
       if (hasFP(MF))
index e725da61e5fd525230f16a1991eda22db2e4c225..fd5d442d25d164a59c49aaec41aab602b3582d38 100644 (file)
 #include <iostream>
 using namespace llvm;
 
-namespace llvm {
-  // Switch toggling compilation for AIX
-  extern cl::opt<bool> AIX;
-}
-
 PPC64RegisterInfo::PPC64RegisterInfo()
   : PPC64GenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP) {
   ImmToIdxMap[PPC::LD]   = PPC::LDX;    ImmToIdxMap[PPC::STD]  = PPC::STDX;
index 9fa57a9c406044dabd99880e78bb5ba18ebf24d7..974ebecb1d02c3bd55f169115e68825883ca6003 100644 (file)
@@ -22,7 +22,7 @@ def GPRC : RegisterClass<i64, 64,
 {
   let Methods = [{
     iterator allocation_order_begin(MachineFunction &MF) const {
-      return begin() + (AIX ? 1 : 0);
+      return begin() + ((TargetAIX == PPCTarget) ? 1 : 0);
     }
     iterator allocation_order_end(MachineFunction &MF) const {
       if (hasFP(MF))
index 0b6041ffaf2da033b9c30468b440a5454481d8af..ce6c46c888ece333633404d437fc1cc7cd54a434 100644 (file)
 #include <iostream>
 using namespace llvm;
 
-namespace llvm {
-  // Switch toggling compilation for AIX
-  extern cl::opt<bool> AIX;
-}
-
 PPC32RegisterInfo::PPC32RegisterInfo()
   : PPC32GenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP) {
   ImmToIdxMap[PPC::LD]   = PPC::LDX;    ImmToIdxMap[PPC::STD]  = PPC::STDX;
index 8393a3b3f49567963584a5d195b0c0edf8b68802..8e640899bc29a93b9b213b5e60f7ad0f02afd98a 100644 (file)
@@ -19,6 +19,7 @@
 #include "PPC64JITInfo.h"
 #include "llvm/Module.h"
 #include "llvm/PassManager.h"
+#include "llvm/Analysis/Verifier.h"
 #include "llvm/CodeGen/IntrinsicLowering.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/Passes.h"
 using namespace llvm;
 
 bool llvm::GPOPT = false;
+PPCTargetEnum llvm::PPCTarget = TargetDefault;
 
 namespace llvm {
-  cl::opt<bool> AIX("aix",
-                    cl::desc("Generate AIX/xcoff instead of Darwin/MachO"),
-                    cl::Hidden);
+  cl::opt<PPCTargetEnum, true>
+  PPCTargetArg(
+         cl::desc("Force generation of code for a specific PPC target:"),
+         cl::values(
+                    clEnumValN(TargetAIX,  "aix", "  Enable AIX codegen"),
+                    clEnumValN(TargetDarwin,"darwin","  Enable Darwin codegen"),
+                    clEnumValEnd),
+         cl::location(PPCTarget), cl::init(TargetDefault));
   cl::opt<bool> EnablePPCLSR("enable-lsr-for-ppc",
                              cl::desc("Enable LSR for PPC (beta)"),
                              cl::Hidden);
@@ -62,7 +69,12 @@ PowerPCTargetMachine::PowerPCTargetMachine(const std::string &name,
                                            const Module &M,
                                            const TargetData &TD,
                                            const PowerPCFrameInfo &TFI)
-: TargetMachine(name, IL, TD), FrameInfo(TFI), Subtarget(M) {}
+: TargetMachine(name, IL, TD), FrameInfo(TFI), Subtarget(M) {
+  if (TargetDefault == PPCTarget) {
+    if (Subtarget.IsAIX()) PPCTarget = TargetAIX;
+    if (Subtarget.IsDarwin()) PPCTarget = TargetDarwin;
+  }
+}
 
 unsigned PPC32TargetMachine::getJITMatchQuality() {
 #if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
@@ -84,6 +96,7 @@ bool PowerPCTargetMachine::addPassesToEmitFile(PassManager &PM,
 
   if (EnablePPCLSR) {
     PM.add(createLoopStrengthReducePass());
+    PM.add(createVerifierPass());
     PM.add(createCFGSimplificationPass());
   }
 
@@ -122,10 +135,19 @@ bool PowerPCTargetMachine::addPassesToEmitFile(PassManager &PM,
   // Must run branch selection immediately preceding the asm printer
   PM.add(createPPCBranchSelectionPass());
 
-  if (AIX)
+  // Decide which asm printer to use.  If the user has not specified one on
+  // the command line, choose whichever one matches the default (current host).
+  switch (PPCTarget) {
+  case TargetDefault:
+    assert(0 && "Default host has no asm printer!");
+    break;
+  case TargetAIX:
     PM.add(createAIXAsmPrinter(Out, *this));
-  else
+    break;
+  case TargetDarwin:
     PM.add(createDarwinAsmPrinter(Out, *this));
+    break;
+  }
 
   PM.add(createMachineCodeDeleter());
   return false;