mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-09 01:38:03 +00:00
MCExpr: Add FindAssociatedSection, which attempts to mirror the 'as' semantics
that associate sections with expressions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130517 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6db7fe8736
commit
0eab5c4d85
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user