aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/AsmPrinter/DwarfException.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2009-08-29 12:20:54 +0000
committerBill Wendling <isanbard@gmail.com>2009-08-29 12:20:54 +0000
commit9b35a09e7e5b1aa26588e3852fe00a42b4f383ba (patch)
treec3571e53bc11aa570e3fa942c646151e3f1fa086 /lib/CodeGen/AsmPrinter/DwarfException.cpp
parentb5abecded7573de0747f9f529a52561741bed0a2 (diff)
- Add target lowering methods to get the preferred format for the FDE and LSDA
encodings. - Make some of the values emitted by the FDEs dependent upon the pointer size. This is in line with how GCC does things. And it has the benefit of working for Darwin in 64-bit mode now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80428 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfException.cpp')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfException.cpp47
1 files changed, 30 insertions, 17 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp
index a8d8bfd759..e32447392f 100644
--- a/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -22,6 +22,7 @@
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetFrameInfo.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
+#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Support/Dwarf.h"
@@ -80,6 +81,7 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) {
EmitLabel("eh_frame_common_begin", Index);
Asm->EmitInt32((int)0);
Asm->EOL("CIE Identifier Tag");
+
Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Asm->EOL("CIE Version");
@@ -91,23 +93,29 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) {
// Round out reader.
Asm->EmitULEB128Bytes(1);
Asm->EOL("CIE Code Alignment Factor");
+
Asm->EmitSLEB128Bytes(stackGrowth);
Asm->EOL("CIE Data Alignment Factor");
+
Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
Asm->EOL("CIE Return Address Column");
+ unsigned Encoding = 0;
+
// If there is a personality, we need to indicate the function's location.
if (Personality) {
Asm->EmitULEB128Bytes(7);
Asm->EOL("Augmentation Size");
if (MAI->getNeedsIndirectEncoding()) {
- Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 |
- dwarf::DW_EH_PE_indirect);
- Asm->EOL("Personality (pcrel sdata4 indirect)");
+ Encoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 |
+ dwarf::DW_EH_PE_indirect;
+ Asm->EmitInt8(Encoding);
+ Asm->EOL("Personality", Encoding);
} else {
- Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
- Asm->EOL("Personality (pcrel sdata4)");
+ Encoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
+ Asm->EmitInt8(Encoding);
+ Asm->EOL("Personality", Encoding);
}
PrintRelDirective(true);
@@ -118,17 +126,20 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) {
O << "-" << MAI->getPCSymbol();
Asm->EOL("Personality");
- Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
- Asm->EOL("LSDA Encoding (pcrel sdata4)");
+ Encoding = Asm->TM.getTargetLowering()->getPreferredLSDADataFormat();
+ Asm->EmitInt8(Encoding);
+ Asm->EOL("LSDA Encoding", Encoding);
- Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
- Asm->EOL("FDE Encoding (pcrel sdata4)");
+ Encoding = Asm->TM.getTargetLowering()->getPreferredFDEDataFormat();
+ Asm->EmitInt8(Encoding);
+ Asm->EOL("FDE Encoding", Encoding);
} else {
Asm->EmitULEB128Bytes(1);
Asm->EOL("Augmentation Size");
- Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
- Asm->EOL("FDE Encoding (pcrel sdata4)");
+ Encoding = Asm->TM.getTargetLowering()->getPreferredFDEDataFormat();
+ Asm->EmitInt8(Encoding);
+ Asm->EOL("FDE Encoding", Encoding);
}
// Indicate locations of general callee saved registers in frame.
@@ -152,6 +163,7 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
"Should not emit 'available externally' functions at all");
const Function *TheFunc = EHFrameInfo.function;
+ bool is4Byte = TD->getPointerSize() == sizeof(int32_t);
Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection());
@@ -195,23 +207,22 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
Asm->EOL("FDE CIE offset");
- EmitReference("eh_func_begin", EHFrameInfo.Number, true, true);
+ EmitReference("eh_func_begin", EHFrameInfo.Number, true, is4Byte);
Asm->EOL("FDE initial location");
+
EmitDifference("eh_func_end", EHFrameInfo.Number,
- "eh_func_begin", EHFrameInfo.Number, true);
+ "eh_func_begin", EHFrameInfo.Number, is4Byte);
Asm->EOL("FDE address range");
// If there is a personality and landing pads then point to the language
// specific data area in the exception table.
if (MMI->getPersonalities()[0] != NULL) {
- bool is4Byte = TD->getPointerSize() == sizeof(int32_t);
-
Asm->EmitULEB128Bytes(is4Byte ? 4 : 8);
Asm->EOL("Augmentation size");
- if (EHFrameInfo.hasLandingPads)
+ if (EHFrameInfo.hasLandingPads) {
EmitReference("exception", EHFrameInfo.Number, true, false);
- else {
+ } else {
if (is4Byte)
Asm->EmitInt32((int)0);
else
@@ -918,6 +929,8 @@ void DwarfException::EndFunction() {
MF->getFunction()));
}
+ MF = 0;
+
if (TimePassesIsEnabled)
ExceptionTimer->stopTimer();
}