From e25e889c7c45295ecf6a671076e38726be943f87 Mon Sep 17 00:00:00 2001 From: Pete Cooper Date: Mon, 8 Jun 2015 17:17:19 +0000 Subject: [PATCH] Move all of the MCSymbol COFF flags logic in to MCSymbolCOFF. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit All flags setting/getting is now done in the class with helper methods instead of users having to get the bits in the correct order. Reviewed by Rafael Espíndola. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239314 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCSymbolCOFF.h | 30 +++++++++++++++++++++++++++++- include/llvm/Support/COFF.h | 8 -------- lib/MC/WinCOFFObjectWriter.cpp | 7 +++---- lib/MC/WinCOFFStreamer.cpp | 9 ++++----- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/include/llvm/MC/MCSymbolCOFF.h b/include/llvm/MC/MCSymbolCOFF.h index efa23de1817..2172c67981c 100644 --- a/include/llvm/MC/MCSymbolCOFF.h +++ b/include/llvm/MC/MCSymbolCOFF.h @@ -10,7 +10,6 @@ #define LLVM_MC_MCSYMBOLCOFF_H #include "llvm/MC/MCSymbol.h" -#include "llvm/Support/COFF.h" namespace llvm { class MCSymbolCOFF : public MCSymbol { @@ -18,6 +17,14 @@ class MCSymbolCOFF : public MCSymbol { /// This corresponds to the e_type field of the COFF symbol. mutable uint16_t Type; + enum SymbolFlags : uint16_t { + SF_ClassMask = 0x00FF, + SF_ClassShift = 0, + + SF_WeakExternal = 0x0100, + SF_SafeSEH = 0x0200, + }; + public: MCSymbolCOFF(const StringMapEntry *Name, bool isTemporary) : MCSymbol(SymbolKindCOFF, Name, isTemporary), Type(0) {} @@ -29,6 +36,27 @@ public: Type = Ty; } + uint16_t getClass() const { + return (getFlags() & SF_ClassMask) >> SF_ClassShift; + } + void setClass(uint16_t StorageClass) const { + modifyFlags(StorageClass << SF_ClassShift, SF_ClassMask); + } + + bool isWeakExternal() const { + return getFlags() & SF_WeakExternal; + } + void setIsWeakExternal() const { + modifyFlags(SF_WeakExternal, SF_WeakExternal); + } + + bool isSafeSEH() const { + return getFlags() & SF_SafeSEH; + } + void setIsSafeSEH() const { + modifyFlags(SF_SafeSEH, SF_SafeSEH); + } + static bool classof(const MCSymbol *S) { return S->isCOFF(); } }; } diff --git a/include/llvm/Support/COFF.h b/include/llvm/Support/COFF.h index fa210272f7e..b26af61a7c7 100644 --- a/include/llvm/Support/COFF.h +++ b/include/llvm/Support/COFF.h @@ -155,14 +155,6 @@ namespace COFF { uint8_t NumberOfAuxSymbols; }; - enum SymbolFlags : uint16_t { - SF_ClassMask = 0x00FF, - SF_ClassShift = 0, - - SF_WeakExternal = 0x0100, - SF_SafeSEH = 0x0200, - }; - enum SymbolSectionNumber : int32_t { IMAGE_SYM_DEBUG = -2, IMAGE_SYM_ABSOLUTE = -1, diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 3aabce6d688..423c7dce45d 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -228,7 +228,7 @@ bool COFFSymbol::should_keep() const { } // if this is a safeseh handler, keep it - if (MC && (MC->getFlags() & COFF::SF_SafeSEH)) + if (MC && (cast(MC)->isSafeSEH())) return true; // if the section its in is being droped, drop it @@ -394,7 +394,7 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &Symbol, COFFSymbol *coff_symbol = GetOrCreateCOFFSymbol(&Symbol); SymbolMap[&Symbol] = coff_symbol; - if (Symbol.getFlags() & COFF::SF_WeakExternal) { + if (cast(Symbol).isWeakExternal()) { coff_symbol->Data.StorageClass = COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL; if (Symbol.isVariable()) { @@ -430,8 +430,7 @@ void WinCOFFObjectWriter::DefineSymbol(const MCSymbol &Symbol, const MCSymbolCOFF &SymbolCOFF = cast(Symbol); coff_symbol->Data.Type = SymbolCOFF.getType(); - coff_symbol->Data.StorageClass = - (Symbol.getFlags() & COFF::SF_ClassMask) >> COFF::SF_ClassShift; + coff_symbol->Data.StorageClass = SymbolCOFF.getClass(); // If no storage class was specified in the streamer, define it here. if (coff_symbol->Data.StorageClass == COFF::IMAGE_SYM_CLASS_NULL) { diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 8f33c78a837..41fc8e4681e 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -102,7 +102,7 @@ bool MCWinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol, default: return false; case MCSA_WeakReference: case MCSA_Weak: - Symbol->modifyFlags(COFF::SF_WeakExternal, COFF::SF_WeakExternal); + cast(Symbol)->setIsWeakExternal(); Symbol->setExternal(true); break; case MCSA_Global: @@ -137,8 +137,7 @@ void MCWinCOFFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) { "' out of range"); getAssembler().registerSymbol(*CurSymbol); - CurSymbol->modifyFlags(StorageClass << COFF::SF_ClassShift, - COFF::SF_ClassMask); + cast(CurSymbol)->setClass((uint16_t)StorageClass); } void MCWinCOFFStreamer::EmitCOFFSymbolType(int Type) { @@ -165,7 +164,7 @@ void MCWinCOFFStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) { Triple::x86) return; - if (Symbol->getFlags() & COFF::SF_SafeSEH) + if (cast(Symbol)->isSafeSEH()) return; MCSection *SXData = getContext().getObjectFileInfo()->getSXDataSection(); @@ -176,7 +175,7 @@ void MCWinCOFFStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) { new MCSafeSEHFragment(Symbol, SXData); getAssembler().registerSymbol(*Symbol); - Symbol->modifyFlags(COFF::SF_SafeSEH, COFF::SF_SafeSEH); + cast(Symbol)->setIsSafeSEH(); } void MCWinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) { -- 2.34.1