mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-21 03:28:31 +00:00
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:
parent
fedd0e2a21
commit
b1bba1a339
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user