diff options
author | Bill Wendling <isanbard@gmail.com> | 2007-09-11 08:27:17 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2007-09-11 08:27:17 +0000 |
commit | d60da495cd5c6bc119b3489e6b3147158735bb99 (patch) | |
tree | d26aa4b527b45bdc2f8b0f53673cd5e6a763363f /lib | |
parent | 29ce95511f905df3a63e3b953a4a0179ead46865 (diff) | |
download | external_llvm-d60da495cd5c6bc119b3489e6b3147158735bb99.zip external_llvm-d60da495cd5c6bc119b3489e6b3147158735bb99.tar.gz external_llvm-d60da495cd5c6bc119b3489e6b3147158735bb99.tar.bz2 |
The personality function on Darwin needs a global stub. We then refer to
that global stub instead of doing the ".set" thingy we were doing before.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41838 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 29 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 2 | ||||
-rw-r--r-- | lib/Target/X86/X86ATTAsmPrinter.cpp | 3 | ||||
-rw-r--r-- | lib/Target/X86/X86AsmPrinter.cpp | 9 | ||||
-rw-r--r-- | lib/Target/X86/X86AsmPrinter.h | 3 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 2 |
6 files changed, 26 insertions, 22 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 073cb4a..2b4b4ce 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2789,26 +2789,15 @@ private: if (Personality) { Asm->EmitULEB128Bytes(7); Asm->EOL("Augmentation Size"); - Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4); - Asm->EOL("Personality (pcrel sdata4)"); + Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect); + Asm->EOL("Personality (pcrel sdata4 indirect)"); - if (TAI->needsSet()) { - O << "\t.set\t"; - PrintLabelName("set", SetCounter); - O << ","; - Asm->EmitExternalGlobal((const GlobalVariable *)(Personality)); - O << "-" << TAI->getPCSymbol(); - Asm->EOL("Set Personality"); - PrintRelDirective(); - PrintLabelName("set", SetCounter); - Asm->EOL("Personality"); - ++SetCounter; - } else { - PrintRelDirective(); - Asm->EmitExternalGlobal((const GlobalVariable *)(Personality)); - O << "-" << TAI->getPCSymbol(); - Asm->EOL("Personality"); - } + PrintRelDirective(); + O << TAI->getPersonalityPrefix(); + Asm->EmitExternalGlobal((const GlobalVariable *)(Personality)); + O << TAI->getPersonalitySuffix(); + O << "-" << TAI->getPCSymbol(); + Asm->EOL("Personality"); Asm->EmitULEB128Bytes(DW_EH_PE_pcrel); Asm->EOL("LSDA Encoding (pcrel)"); @@ -3297,7 +3286,7 @@ public: const std::vector<Function *> Personalities = MMI->getPersonalities(); for (unsigned i =0; i < Personalities.size(); ++i) EmitCommonEHFrame(Personalities[i], i); - + for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(), E = EHFrames.end(); I != E; ++I) EmitEHFrame(*I); diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index df7a2ec..09a8d5a 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -38,6 +38,8 @@ TargetAsmInfo::TargetAsmInfo() : GlobalVarAddrSuffix(""), FunctionAddrPrefix(""), FunctionAddrSuffix(""), + PersonalityPrefix(""), + PersonalitySuffix(""), InlineAsmStart("#APP"), InlineAsmEnd("#NO_APP"), AssemblerDialect(0), diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index b0e6ed1..3d54d69 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -74,7 +74,8 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { if (TAI->doesSupportDebugInformation()) { // Let PassManager know we need debug information and relay // the MachineModuleInfo address on to DwarfWriter. - DW.SetModuleInfo(&getAnalysis<MachineModuleInfo>()); + MMI = &getAnalysis<MachineModuleInfo>(); + DW.SetModuleInfo(MMI); } SetupMachineFunction(MF); diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index a06cc6f..b7de8f0 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -352,6 +352,15 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { O << "\n"; + if (MMI) { + // Add the (possibly multiple) personalities to the set of global values. + const std::vector<Function *>& Personalities = MMI->getPersonalities(); + + for (std::vector<Function *>::const_iterator I = Personalities.begin(), + E = Personalities.end(); I != E; ++I) + if (*I) GVStubs.insert("_" + (*I)->getName()); + } + // Output stubs for external and common global variables. if (GVStubs.begin() != GVStubs.end()) SwitchToDataSection( diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h index 45be89e..49110f4 100644 --- a/lib/Target/X86/X86AsmPrinter.h +++ b/lib/Target/X86/X86AsmPrinter.h @@ -30,10 +30,11 @@ namespace llvm { struct VISIBILITY_HIDDEN X86SharedAsmPrinter : public AsmPrinter { DwarfWriter DW; + MachineModuleInfo *MMI; X86SharedAsmPrinter(std::ostream &O, X86TargetMachine &TM, const TargetAsmInfo *T) - : AsmPrinter(O, TM, T), DW(O, this, T) { + : AsmPrinter(O, TM, T), DW(O, this, T), MMI(0) { Subtarget = &TM.getSubtarget<X86Subtarget>(); } diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index 07a1a19..414782e 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -68,6 +68,8 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { StaticCtorsSection = ".mod_init_func"; StaticDtorsSection = ".mod_term_func"; } + PersonalityPrefix = "L"; + PersonalitySuffix = "$non_lazy_ptr"; InlineAsmStart = "# InlineAsm Start"; InlineAsmEnd = "# InlineAsm End"; SetDirective = "\t.set"; |