]> granicus.if.org Git - llvm/commitdiff
[PowerPC][XCOFF][MC] Explicitly set containing csect on symbols. [NFC]
authorSean Fertile <sfertile@ca.ibm.com>
Thu, 22 Aug 2019 15:11:23 +0000 (15:11 +0000)
committerSean Fertile <sfertile@ca.ibm.com>
Thu, 22 Aug 2019 15:11:23 +0000 (15:11 +0000)
Previously we would get the csect a symbol was contained in through its
fragment. This works only if we are writing an object file, and only for
defined symbols. To fix this we set the contating csect explicitly on the
MCSymbolXCOFF object.

Differential Revision: https://reviews.llvm.org/D66032

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

include/llvm/MC/MCSymbolXCOFF.h
lib/MC/XCOFFObjectWriter.cpp
lib/Target/PowerPC/PPCAsmPrinter.cpp

index 087cf5d0feba5363b1cf46095dd89d5ec20ad7a7..566aa7ca8eb490f68dd904503e7e402fccbbc18c 100644 (file)
@@ -14,6 +14,8 @@
 
 namespace llvm {
 
+class MCSectionXCOFF;
+
 class MCSymbolXCOFF : public MCSymbol {
 public:
   MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary)
@@ -33,8 +35,22 @@ public:
     return StorageClass.getValue();
   }
 
+  void setContainingCsect(const MCSectionXCOFF *C) {
+    assert((!ContainingCsect || ContainingCsect == C) &&
+           "Trying to set a containing csect that doesn't match the one that"
+           "this symbol is already mapped to.");
+    ContainingCsect = C;
+  }
+
+  const MCSectionXCOFF *getContainingCsect() const {
+    assert(ContainingCsect &&
+           "Trying to get containing csect but none was set.");
+    return ContainingCsect;
+  }
+
 private:
   Optional<XCOFF::StorageClass> StorageClass;
+  const MCSectionXCOFF *ContainingCsect = nullptr;
 };
 
 } // end namespace llvm
index 94c95279c06e79e403de6abd71f28fdbf24eec4f..d4dfd467976ab9ed271766b0a41469aa9b6b6a07 100644 (file)
@@ -247,8 +247,7 @@ void XCOFFObjectWriter::executePostLayoutBinding(
     const MCSymbolXCOFF *XSym = cast<MCSymbolXCOFF>(&S);
 
     // Map the symbol into its containing csect.
-    MCSectionXCOFF *ContainingCsect =
-        dyn_cast<MCSectionXCOFF>(XSym->getFragment(false)->getParent());
+    const MCSectionXCOFF *ContainingCsect = XSym->getContainingCsect();
     assert(WrapperMap.find(ContainingCsect) != WrapperMap.end() &&
            "Expected containing csect to exist in map");
 
index 39641879cc18ffa2434ce2c8a07878af34d76ec7..8d23238e6159ef900988872dec89b8b63b462b8e 100644 (file)
@@ -1671,6 +1671,8 @@ void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
   MCSymbolXCOFF *XSym = cast<MCSymbolXCOFF>(getSymbol(GV));
   XSym->setStorageClass(
       TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV));
+  XSym->setContainingCsect(CSect);
+
   const DataLayout &DL = GV->getParent()->getDataLayout();
   unsigned Align =
       GV->getAlignment() ? GV->getAlignment() : DL.getPreferredAlignment(GV);