diff options
-rw-r--r-- | llvm/include/llvm/MC/MCSymbolXCOFF.h | 16 | ||||
-rw-r--r-- | llvm/lib/MC/XCOFFObjectWriter.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 2 |
3 files changed, 19 insertions, 2 deletions
diff --git a/llvm/include/llvm/MC/MCSymbolXCOFF.h b/llvm/include/llvm/MC/MCSymbolXCOFF.h index 087cf5d0feb..566aa7ca8eb 100644 --- a/llvm/include/llvm/MC/MCSymbolXCOFF.h +++ b/llvm/include/llvm/MC/MCSymbolXCOFF.h @@ -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 diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp index 94c95279c06..d4dfd467976 100644 --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/llvm/lib/MC/XCOFFObjectWriter.cpp @@ -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"); diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 39641879cc1..8d23238e615 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -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); |