aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/X86
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2007-11-07 00:25:05 +0000
committerDale Johannesen <dalej@apple.com>2007-11-07 00:25:05 +0000
commit483ec21d90295c146b5555ed66c16860bcfff942 (patch)
tree3a5c244b98b2fa0a3b3471a25bc266254091ce89 /lib/Target/X86
parenta57506eea41279f3025499ed07d2cca6c6faf6df (diff)
downloadexternal_llvm-483ec21d90295c146b5555ed66c16860bcfff942.zip
external_llvm-483ec21d90295c146b5555ed66c16860bcfff942.tar.gz
external_llvm-483ec21d90295c146b5555ed66c16860bcfff942.tar.bz2
Interchange Dwarf numbers of ESP and EBP on x86 Darwin.
Much improvement in exception handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43794 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r--lib/Target/X86/X86RegisterInfo.cpp16
-rw-r--r--lib/Target/X86/X86RegisterInfo.h4
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index d37db97..72528c7 100644
--- a/lib/Target/X86/X86RegisterInfo.cpp
+++ b/lib/Target/X86/X86RegisterInfo.cpp
@@ -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.
//
diff --git a/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h
index 3f0db25..ec526c1 100644
--- a/lib/Target/X86/X86RegisterInfo.h
+++ b/lib/Target/X86/X86RegisterInfo.h
@@ -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,