Pack MCSymbol::Flags in to the bitfield with other members. NFC.

All file formats only needed 16-bits right now which is enough to fit
in to the padding with other fields.

This reduces the size of MCSymbol to 24-bytes on a 64-bit system.  The
layout is now

   0 | class llvm::MCSymbol
   0 |   class llvm::PointerIntPair SectionOrFragmentAndHasName
   0 |     intptr_t Value
     |   [sizeof=8, dsize=8, align=8
     |    nvsize=8, nvalign=8]

   8 |   unsigned int IsTemporary
   8 |   unsigned int IsRedefinable
   8 |   unsigned int IsUsed
   8 |   _Bool IsRegistered
   8 |   unsigned int IsExternal
   8 |   unsigned int IsPrivateExtern
   8 |   unsigned int Kind
   9 |   unsigned int IsUsedInReloc
   9 |   unsigned int SymbolContents
   9 |   unsigned int CommonAlignLog2
  10 |   uint32_t Flags
  12 |   uint32_t Index
  16 |   union
  16 |     uint64_t Offset
  16 |     uint64_t CommonSize
  16 |     const class llvm::MCExpr * Value
     |   [sizeof=8, dsize=8, align=8
     |    nvsize=8, nvalign=8]

     | [sizeof=24, dsize=24, align=8
     |  nvsize=24, nvalign=8]

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241196 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Pete Cooper 2015-07-01 21:57:51 +00:00
parent 1efcdba0e2
commit f89e1bdc1a
2 changed files with 12 additions and 6 deletions

View File

@ -117,6 +117,11 @@ protected:
static const unsigned NumCommonAlignmentBits = 5;
unsigned CommonAlignLog2 : NumCommonAlignmentBits;
/// The Flags field is used by object file implementations to store
/// additional per symbol information which is not easily classified.
static const unsigned NumFlagsBits = 16;
mutable uint32_t Flags : NumFlagsBits;
/// Index field, for use by the object file implementation.
mutable uint32_t Index = 0;
@ -131,10 +136,6 @@ protected:
const MCExpr *Value;
};
/// The Flags field is used by object file implementations to store
/// additional per symbol information which is not easily classified.
mutable uint32_t Flags = 0;
protected: // MCContext creates and uniques these.
friend class MCExpr;
friend class MCContext;
@ -152,7 +153,7 @@ protected: // MCContext creates and uniques these.
: IsTemporary(isTemporary), IsRedefinable(false), IsUsed(false),
IsRegistered(false), IsExternal(false), IsPrivateExtern(false),
Kind(Kind), IsUsedInReloc(false), SymbolContents(SymContentsUnset),
CommonAlignLog2(0) {
CommonAlignLog2(0), Flags(0) {
Offset = 0;
SectionOrFragmentAndHasName.setInt(!!Name);
if (Name)
@ -402,10 +403,14 @@ protected:
uint32_t getFlags() const { return Flags; }
/// Set the (implementation defined) symbol flags.
void setFlags(uint32_t Value) const { Flags = Value; }
void setFlags(uint32_t Value) const {
assert(Value < (1U << NumFlagsBits) && "Out of range flags");
Flags = Value;
}
/// Modify the flags via a mask
void modifyFlags(uint32_t Value, uint32_t Mask) const {
assert(Value < (1U << NumFlagsBits) && "Out of range flags");
Flags = (Flags & ~Mask) | Value;
}
};

View File

@ -20,6 +20,7 @@ using namespace llvm;
MCSection *MCSymbol::AbsolutePseudoSection = reinterpret_cast<MCSection *>(1);
const unsigned MCSymbol::NumCommonAlignmentBits;
const unsigned MCSymbol::NumFlagsBits;
void *MCSymbol::operator new(size_t s, const StringMapEntry<bool> *Name,
MCContext &Ctx) {