MC: Shrink MCSymbolRefExpr by only storing the bits we need.

32 -> 16 bytes on x86_64. NFC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219574 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2014-10-11 17:57:27 +00:00
parent fedd0e2a21
commit b1bba1a339
2 changed files with 35 additions and 22 deletions

View File

@ -282,21 +282,20 @@ public:
};
private:
/// The symbol reference modifier.
const unsigned Kind : 16;
/// Specifies how the variant kind should be printed.
const unsigned UseParensForSymbolVariant : 1;
// FIXME: Remove this bit.
const unsigned HasSubsectionsViaSymbols : 1;
/// The symbol being referenced.
const MCSymbol *Symbol;
/// The symbol reference modifier.
const VariantKind Kind;
/// MCAsmInfo that is used to print symbol variants correctly.
const MCAsmInfo *MAI;
explicit MCSymbolRefExpr(const MCSymbol *_Symbol, VariantKind _Kind,
const MCAsmInfo *_MAI)
: MCExpr(MCExpr::SymbolRef), Symbol(_Symbol), Kind(_Kind), MAI(_MAI) {
assert(Symbol);
assert(MAI);
}
explicit MCSymbolRefExpr(const MCSymbol *Symbol, VariantKind Kind,
const MCAsmInfo *MAI);
public:
/// @name Construction
@ -316,9 +315,12 @@ public:
/// @{
const MCSymbol &getSymbol() const { return *Symbol; }
const MCAsmInfo &getMCAsmInfo() const { return *MAI; }
VariantKind getKind() const { return Kind; }
VariantKind getKind() const { return static_cast<VariantKind>(Kind); }
void printVariantKind(raw_ostream &OS) const;
bool hasSubsectionsViaSymbols() const { return HasSubsectionsViaSymbols; }
/// @}
/// @name Static Utility Functions

View File

@ -49,12 +49,8 @@ void MCExpr::print(raw_ostream &OS) const {
else
OS << Sym;
if (SRE.getKind() != MCSymbolRefExpr::VK_None) {
if (SRE.getMCAsmInfo().useParensForSymbolVariant())
OS << '(' << MCSymbolRefExpr::getVariantKindName(SRE.getKind()) << ')';
else
OS << '@' << MCSymbolRefExpr::getVariantKindName(SRE.getKind());
}
if (SRE.getKind() != MCSymbolRefExpr::VK_None)
SRE.printVariantKind(OS);
return;
}
@ -150,6 +146,15 @@ const MCConstantExpr *MCConstantExpr::Create(int64_t Value, MCContext &Ctx) {
/* *** */
MCSymbolRefExpr::MCSymbolRefExpr(const MCSymbol *Symbol, VariantKind Kind,
const MCAsmInfo *MAI)
: MCExpr(MCExpr::SymbolRef), Kind(Kind),
UseParensForSymbolVariant(MAI->useParensForSymbolVariant()),
HasSubsectionsViaSymbols(MAI->hasSubsectionsViaSymbols()),
Symbol(Symbol) {
assert(Symbol);
}
const MCSymbolRefExpr *MCSymbolRefExpr::Create(const MCSymbol *Sym,
VariantKind Kind,
MCContext &Ctx) {
@ -442,6 +447,13 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
.Default(VK_Invalid);
}
void MCSymbolRefExpr::printVariantKind(raw_ostream &OS) const {
if (UseParensForSymbolVariant)
OS << '(' << MCSymbolRefExpr::getVariantKindName(getKind()) << ')';
else
OS << '@' << MCSymbolRefExpr::getVariantKindName(getKind());
}
/* *** */
void MCTargetExpr::anchor() {}
@ -679,7 +691,6 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
case SymbolRef: {
const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this);
const MCSymbol &Sym = SRE->getSymbol();
const MCAsmInfo &MCAsmInfo = SRE->getMCAsmInfo();
// Evaluate recursively if this is a variable.
if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None) {
@ -688,7 +699,7 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCSymbolRefExpr *A = Res.getSymA();
const MCSymbolRefExpr *B = Res.getSymB();
if (MCAsmInfo.hasSubsectionsViaSymbols()) {
if (SRE->hasSubsectionsViaSymbols()) {
// FIXME: This is small hack. Given
// a = b + 4
// .long a