mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +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:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user