diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-28 12:50:37 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-28 12:50:37 +0000 |
commit | 8bca4106dfc2945723251db10e340183f3e372dd (patch) | |
tree | 68af7b6e4480e38f866d864db7b8b0f47aa6201f | |
parent | eb69732d56f7e581bf648df9bf1352d513913df6 (diff) |
Mark the EH symbol global or weak if the corresponding function is.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130397 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 3 | ||||
-rw-r--r-- | lib/MC/MCDwarf.cpp | 1 | ||||
-rw-r--r-- | lib/MC/MCMachOStreamer.cpp | 12 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 4 |
4 files changed, 20 insertions, 0 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index c6a623e84a..e53698106f 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -184,6 +184,9 @@ namespace llvm { /// used in an assignment. virtual void EmitLabel(MCSymbol *Symbol); + virtual void EmitEHSymAttributes(const MCSymbol *Symbol, + MCSymbol *EHSymbol); + /// EmitAssemblerFlag - Note in the output the specified @p Flag virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0; diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 51d0ed8333..974bcba7c7 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -726,6 +726,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer, if (!asmInfo.isFunctionEHFrameSymbolPrivate()) { Twine EHName = frame.Function->getName() + Twine(".eh"); MCSymbol *EHSym = context.GetOrCreateSymbol(EHName); + streamer.EmitEHSymAttributes(frame.Function, EHSym); streamer.EmitLabel(EHSym); } diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index d1f9f5cd56..0982f69c5f 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -44,6 +44,8 @@ public: virtual void InitSections(); virtual void EmitLabel(MCSymbol *Symbol); + virtual void EmitEHSymAttributes(const MCSymbol *Symbol, + MCSymbol *EHSymbol); virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); virtual void EmitThumbFunc(MCSymbol *Func); virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); @@ -101,6 +103,16 @@ void MCMachOStreamer::InitSections() { } +void MCMachOStreamer::EmitEHSymAttributes(const MCSymbol *Symbol, + MCSymbol *EHSymbol) { + MCSymbolData &SD = + getAssembler().getOrCreateSymbolData(*Symbol); + if (SD.isExternal()) + EmitSymbolAttribute(EHSymbol, MCSA_Global); + if (SD.getFlags() & SF_WeakDefinition) + EmitSymbolAttribute(EHSymbol, MCSA_WeakDefinition); +} + void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index cfec865913..b5cddcde6f 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -154,6 +154,10 @@ void MCStreamer::EnsureValidFrame() { report_fatal_error("No open frame"); } +void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol, + MCSymbol *EHSymbol) { +} + void MCStreamer::EmitLabel(MCSymbol *Symbol) { assert(!Symbol->isVariable() && "Cannot emit a variable symbol!"); assert(getCurrentSection() && "Cannot emit before setting section!"); |