Move all of the MCSymbol COFF flags logic in to MCSymbolCOFF.
authorPete Cooper <peter_cooper@apple.com>
Mon, 8 Jun 2015 17:17:19 +0000 (17:17 +0000)
committerPete Cooper <peter_cooper@apple.com>
Mon, 8 Jun 2015 17:17:19 +0000 (17:17 +0000)
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
include/llvm/Support/COFF.h
lib/MC/WinCOFFObjectWriter.cpp
lib/MC/WinCOFFStreamer.cpp

index efa23de18175954d7bba240ed2a7d9c173e95439..2172c67981c0234e9ffebbba3afdcab5fbbec5d9 100644 (file)
@@ -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<bool> *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(); }
 };
 }
index fa210272f7e76ce1d41a3db48a7ad9c276f134cf..b26af61a7c7030b02b5e7d239ede7b5f42e3387e 100644 (file)
@@ -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,
index 3aabce6d6885d39e36ac3a538067e720ddde62ff..423c7dce45da1eb6297664e08d509ac8a5ac3e37 100644 (file)
@@ -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<MCSymbolCOFF>(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<MCSymbolCOFF>(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<MCSymbolCOFF>(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) {
index 8f33c78a837de0345d9e1b6b06d93f2872c4509a..41fc8e4681efc0a400ede85ea38acf690f520952 100644 (file)
@@ -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<MCSymbolCOFF>(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<MCSymbolCOFF>(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<MCSymbolCOFF>(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<MCSymbolCOFF>(Symbol)->setIsSafeSEH();
 }
 
 void MCWinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {