Interchange Dwarf numbers of ESP and EBP on x86 Darwin.
authorDale Johannesen <dalej@apple.com>
Wed, 7 Nov 2007 00:25:05 +0000 (00:25 +0000)
committerDale Johannesen <dalej@apple.com>
Wed, 7 Nov 2007 00:25:05 +0000 (00:25 +0000)
Much improvement in exception handling.

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

lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.h
utils/TableGen/RegisterInfoEmitter.cpp

index d37db976c6b8a23b5b8c7032c398bcef829c17c1..72528c73b19b6e02ac5e87c6195d8ae61a6b92b1 100644 (file)
@@ -654,6 +654,22 @@ X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
   assert(AmbEntries.empty() && "Duplicated entries in unfolding maps?");
 }
 
+// getDwarfRegNum - This function maps LLVM register identifiers to the
+// Dwarf specific numbering, used in debug info and exception tables.
+// The registers are given "basic" dwarf numbers in the .td files,
+// which are collected by TableGen into X86GenRegisterInfo::getDwarfRegNum.
+// This wrapper allows for target-specific overrides.
+int X86RegisterInfo::getDwarfRegNum(unsigned RegNo) const {
+  int n = X86GenRegisterInfo::getDwarfRegNum(RegNo);
+  const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
+  if (Subtarget->isDarwin) {
+    // ESP and EBP are switched.
+    if (n==4) return 5;
+    if (n==5) return 4;
+  }
+  return n;
+}
+
 // getX86RegNum - This function maps LLVM register identifiers to their X86
 // specific numbering, which is used in various places encoding instructions.
 //
index 3f0db25f2a7467e4558346e611adfdfc7dc17510..ec526c1773ba1c985cdf42c6eaf52a85ec59d938 100644 (file)
@@ -77,6 +77,10 @@ public:
   /// register identifier.
   unsigned getX86RegNum(unsigned RegNo);
 
+  /// getDwarfRegNum - allows modification of X86GenRegisterInfo::getDwarfRegNum
+  /// (created by TableGen) for target dependencies.
+  int getDwarfRegNum(unsigned RegNum) const;
+
   /// Code Generation virtual methods...
   ///
   bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
index 2f948afa3deec31d5b98f48d4569e296ba9bb701..48262babdf163f8d7b2968b19d1ca8a88e30dbbc 100644 (file)
@@ -60,7 +60,7 @@ void RegisterInfoEmitter::runHeader(std::ostream &OS) {
   OS << "struct " << ClassName << " : public MRegisterInfo {\n"
      << "  " << ClassName
      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
-     << "  int getDwarfRegNum(unsigned RegNum) const;\n"
+     << "  virtual int getDwarfRegNum(unsigned RegNum) const;\n"
      << "  unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
      << "};\n\n";