Add a parameter to the Win64 EH section getters to get a section with a
authorCharles Davis <cdavis@mines.edu>
Fri, 27 May 2011 19:09:24 +0000 (19:09 +0000)
committerCharles Davis <cdavis@mines.edu>
Fri, 27 May 2011 19:09:24 +0000 (19:09 +0000)
suffix (e.g. .xdata$myfunc). The suffix part isn't implemented yet, but
I'll get to it in the next patch.

Fix up all callers of the affected functions. Make them pass said suffix to
the function.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132205 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
include/llvm/MC/MCWin64EH.h
include/llvm/Target/TargetAsmInfo.h
include/llvm/Target/TargetLoweringObjectFile.h
lib/MC/MCAsmStreamer.cpp
lib/MC/MCWin64EH.cpp

index c61cf399f82eba57a53c2bd988b24d83c4c57dea..70a46759d70f25954dfe978d28112cb4813073b6 100644 (file)
@@ -58,8 +58,10 @@ public:
   virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
 
   virtual const MCSection *getEHFrameSection() const;
-  virtual const MCSection *getWin64EHFuncTableSection() const { return NULL; }
-  virtual const MCSection *getWin64EHTableSection() const { return NULL; }
+  virtual const MCSection *getWin64EHFuncTableSection(StringRef) const {
+    return NULL;
+  }
+  virtual const MCSection *getWin64EHTableSection(StringRef) const{return NULL;}
 
   virtual void emitPersonalityValue(MCStreamer &Streamer,
                                     const TargetMachine &TM,
@@ -135,8 +137,10 @@ public:
   virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
 
   virtual const MCSection *getEHFrameSection() const;
-  virtual const MCSection *getWin64EHFuncTableSection() const { return NULL; }
-  virtual const MCSection *getWin64EHTableSection() const { return NULL; }
+  virtual const MCSection *getWin64EHFuncTableSection(StringRef) const {
+    return NULL;
+  }
+  virtual const MCSection *getWin64EHTableSection(StringRef) const{return NULL;}
 
   virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
@@ -209,10 +213,12 @@ public:
   virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
 
   virtual const MCSection *getEHFrameSection() const;
-  virtual const MCSection *getWin64EHFuncTableSection() const {
+  virtual const MCSection *getWin64EHFuncTableSection(StringRef) const {
     return PDataSection;
   }
-  virtual const MCSection *getWin64EHTableSection() const {return XDataSection;}
+  virtual const MCSection *getWin64EHTableSection(StringRef) const {
+    return XDataSection;
+  }
 
   virtual const MCSection *getDrectveSection() const { return DrectveSection; }
 
index 5c0cfad7c36e4b3cb51c23013d0050c8ff7f6767..eb4665a2e994c2106e8e41119fcecfdcda2299b8 100644 (file)
@@ -20,6 +20,7 @@
 #include <vector>
 
 namespace llvm {
+  class StringRef;
   class MCStreamer;
   class MCSymbol;
 
@@ -80,6 +81,7 @@ namespace llvm {
 
   class MCWin64EHUnwindEmitter {
   public:
+    static StringRef GetSectionSuffix(const MCSymbol *func);
     //
     // This emits the unwind info sections (.pdata and .xdata in PE/COFF).
     //
index cd93c2ba0e82f4c54c7f024f7d8da3d85656cdae..c30409d9f98d015692dce2ed3bbcf3248e136285 100644 (file)
@@ -63,12 +63,12 @@ public:
     return TLOF->getDwarfFrameSection();
   }
 
-  const MCSection *getWin64EHFuncTableSection() const {
-    return TLOF->getWin64EHFuncTableSection();
+  const MCSection *getWin64EHFuncTableSection(StringRef Suffix) const {
+    return TLOF->getWin64EHFuncTableSection(Suffix);
   }
 
-  const MCSection *getWin64EHTableSection() const {
-    return TLOF->getWin64EHTableSection();
+  const MCSection *getWin64EHTableSection(StringRef Suffix) const {
+    return TLOF->getWin64EHTableSection(Suffix);
   }
 
   unsigned getFDEEncoding(bool CFI) const {
index 78d49a96a6a099af5845d3271d180278e9358e3c..3991035ce064823412f078ec14030b570c177664 100644 (file)
@@ -155,8 +155,8 @@ public:
   const MCSection *getTLSExtraDataSection() const {
     return TLSExtraDataSection;
   }
-  virtual const MCSection *getWin64EHFuncTableSection() const = 0;
-  virtual const MCSection *getWin64EHTableSection() const = 0;
+  virtual const MCSection *getWin64EHFuncTableSection(StringRef suffix)const=0;
+  virtual const MCSection *getWin64EHTableSection(StringRef suffix) const = 0;
   
   /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
   /// decide not to emit the UsedDirective for some symbols in llvm.used.
index 9376d55e71755ed4c8515c9ae277881d1ef4d216..ada3a70bf656b15cf3adbb2f80ff409f7cb934ea 100644 (file)
@@ -977,8 +977,10 @@ void MCAsmStreamer::EmitWin64EHHandlerData() {
   // cause the section switch to be visible in the emitted assembly.
   // We only do this so the section switch that terminates the handler
   // data block is visible.
+  MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo();
+  StringRef suffix=MCWin64EHUnwindEmitter::GetSectionSuffix(CurFrame->Function);
   const MCSection *xdataSect =
-                       getContext().getTargetAsmInfo().getWin64EHTableSection();
+    getContext().getTargetAsmInfo().getWin64EHTableSection(suffix);
   if (xdataSect)
     SwitchSectionNoChange(xdataSect);
 
index 018bb7cf6f877bc075b72bb54c026be05a0ab712..9453f5c2a9632f5c538d02e804a301564e02e323 100644 (file)
@@ -10,6 +10,8 @@
 #include "llvm/MC/MCWin64EH.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/MC/MCSectionCOFF.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/Target/TargetAsmInfo.h"
 
@@ -199,13 +201,33 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) {
   }
 }
 
+StringRef MCWin64EHUnwindEmitter::GetSectionSuffix(const MCSymbol *func) {
+  if (!func || !func->isInSection()) return "";
+  const MCSection *section = &func->getSection();
+  const MCSectionCOFF *COFFSection;
+  if ((COFFSection = dyn_cast<MCSectionCOFF>(section))) {
+    StringRef name = COFFSection->getSectionName();
+    size_t dollar = name.find('$');
+    size_t dot = name.find('.', 1);
+    if (dollar == StringRef::npos && dot == StringRef::npos)
+      return "";
+    if (dot == StringRef::npos)
+      return name.substr(dollar);
+    if (dollar == StringRef::npos || dot < dollar)
+      return name.substr(dot);
+    return name.substr(dollar);
+  }
+  return "";
+}
+
 void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
                                             MCWin64EHUnwindInfo *info) {
   // Switch sections (the static function above is meant to be called from
   // here and from Emit().
   MCContext &context = streamer.getContext();
   const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
-  const MCSection *xdataSect = asmInfo.getWin64EHTableSection();
+  const MCSection *xdataSect =
+    asmInfo.getWin64EHTableSection(GetSectionSuffix(info->Function));
   streamer.SwitchSection(xdataSect);
 
   llvm::EmitUnwindInfo(streamer, info);
@@ -215,15 +237,21 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
   MCContext &context = streamer.getContext();
   // Emit the unwind info structs first.
   const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
-  const MCSection *xdataSect = asmInfo.getWin64EHTableSection();
-  streamer.SwitchSection(xdataSect);
-  for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i)
-    llvm::EmitUnwindInfo(streamer, &streamer.getW64UnwindInfo(i));
+  for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
+    MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
+    const MCSection *xdataSect =
+      asmInfo.getWin64EHTableSection(GetSectionSuffix(info.Function));
+    streamer.SwitchSection(xdataSect);
+    llvm::EmitUnwindInfo(streamer, &info);
+  }
   // Now emit RUNTIME_FUNCTION entries.
-  const MCSection *pdataSect = asmInfo.getWin64EHFuncTableSection();
-  streamer.SwitchSection(pdataSect);
-  for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i)
-    EmitRuntimeFunction(streamer, &streamer.getW64UnwindInfo(i));
+  for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
+    MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
+    const MCSection *pdataSect =
+      asmInfo.getWin64EHFuncTableSection(GetSectionSuffix(info.Function));
+    streamer.SwitchSection(pdataSect);
+    EmitRuntimeFunction(streamer, &info);
+  }
 }
 
 } // End of namespace llvm