MCExpr: Add FindAssociatedSection, which attempts to mirror the 'as' semantics

that associate sections with expressions.

llvm-svn: 130517
This commit is contained in:
Daniel Dunbar 2011-04-29 18:00:03 +00:00
parent 252e8f9ac1
commit dc3e4cc5ed
4 changed files with 54 additions and 0 deletions

View File

@ -19,6 +19,7 @@ class MCAsmInfo;
class MCAsmLayout;
class MCAssembler;
class MCContext;
class MCSection;
class MCSectionData;
class MCSymbol;
class MCValue;
@ -92,6 +93,12 @@ public:
/// @result - True on success.
bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout &Layout) const;
/// FindAssociatedSection - Find the "associated section" for this expression,
/// which is currently defined as the absolute section for constants, or
/// otherwise the section associated with the first defined symbol in the
/// expression.
const MCSection *FindAssociatedSection() const;
/// @}
static bool classof(const MCExpr *) { return true; }
@ -420,6 +427,7 @@ public:
virtual bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const = 0;
virtual void AddValueSymbols(MCAssembler *) const = 0;
virtual const MCSection *FindAssociatedSection() const = 0;
static bool classof(const MCExpr *E) {
return E->getKind() == MCExpr::Target;

View File

@ -56,6 +56,7 @@ namespace llvm {
mutable unsigned IsUsed : 1;
private: // MCContext creates and uniques these.
friend class MCExpr;
friend class MCContext;
MCSymbol(StringRef name, bool isTemporary)
: Name(name), Section(0), Value(0),

View File

@ -559,3 +559,45 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
assert(0 && "Invalid assembly expression kind!");
return false;
}
const MCSection *MCExpr::FindAssociatedSection() const {
switch (getKind()) {
case Target:
// We never look through target specific expressions.
return cast<MCTargetExpr>(this)->FindAssociatedSection();
case Constant:
return MCSymbol::AbsolutePseudoSection;
case SymbolRef: {
const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(this);
const MCSymbol &Sym = SRE->getSymbol();
if (Sym.isDefined())
return &Sym.getSection();
return 0;
}
case Unary:
return cast<MCUnaryExpr>(this)->getSubExpr()->FindAssociatedSection();
case Binary: {
const MCBinaryExpr *BE = cast<MCBinaryExpr>(this);
const MCSection *LHS_S = BE->getLHS()->FindAssociatedSection();
const MCSection *RHS_S = BE->getRHS()->FindAssociatedSection();
// If either section is absolute, return the other.
if (LHS_S == MCSymbol::AbsolutePseudoSection)
return RHS_S;
if (RHS_S == MCSymbol::AbsolutePseudoSection)
return LHS_S;
// Otherwise, return the first non-null section.
return LHS_S ? LHS_S : RHS_S;
}
}
assert(0 && "Invalid assembly expression kind!");
return 0;
}

View File

@ -60,6 +60,9 @@ public:
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const;
void AddValueSymbols(MCAssembler *) const;
const MCSection *FindAssociatedSection() const {
return getSubExpr()->FindAssociatedSection();
}
static bool classof(const MCExpr *E) {
return E->getKind() == MCExpr::Target;