Mark the EH symbol global or weak if the corresponding function is.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Apr 2011 12:50:37 +0000 (12:50 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Apr 2011 12:50:37 +0000 (12:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130397 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
lib/MC/MCDwarf.cpp
lib/MC/MCMachOStreamer.cpp
lib/MC/MCStreamer.cpp

index c6a623e84a299c3562f3cfbaba0baee4cbf71dff..e53698106fb24caa1581b9b9e42382bdb14f634d 100644 (file)
@@ -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;
 
index 51d0ed83332cdbe208022381b9506fe3d879a8c1..974bcba7c7ea5eb669a55de408157f1aae0e2288 100644 (file)
@@ -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);
   }
 
index d1f9f5cd568e7a6ff2e4d2425ba07cb882b6c82e..0982f69c5ffd8d304879dda72e63564178293ad9 100644 (file)
@@ -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!");
 
index cfec865913998591c5170f86c01f884e707862d7..b5cddcde6f458e0f35e743acc75eebdf4ad6f2c8 100644 (file)
@@ -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!");