mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
This is the first of several patches for Mips direct object generation.
This first patch is for expression variable kinds. Patch by Jack Carter! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142934 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
02dc51806e
commit
3507d24547
@ -174,7 +174,23 @@ public:
|
||||
VK_PPC_DARWIN_HA16, // ha16(symbol)
|
||||
VK_PPC_DARWIN_LO16, // lo16(symbol)
|
||||
VK_PPC_GAS_HA16, // symbol@ha
|
||||
VK_PPC_GAS_LO16 // symbol@l
|
||||
VK_PPC_GAS_LO16, // symbol@l
|
||||
|
||||
VK_Mips_None,
|
||||
VK_Mips_GPREL,
|
||||
VK_Mips_GOT_CALL,
|
||||
VK_Mips_GOT,
|
||||
VK_Mips_ABS_HI,
|
||||
VK_Mips_ABS_LO,
|
||||
VK_Mips_TLSGD,
|
||||
VK_Mips_GOTTPREL,
|
||||
VK_Mips_TPREL_HI,
|
||||
VK_Mips_TPREL_LO,
|
||||
VK_Mips_GPOFF_HI,
|
||||
VK_Mips_GPOFF_LO,
|
||||
VK_Mips_GOT_DISP,
|
||||
VK_Mips_GOT_PAGE,
|
||||
VK_Mips_GOT_OFST
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -308,6 +308,10 @@ void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
|
||||
case MCSymbolRefExpr::VK_ARM_TLSGD:
|
||||
case MCSymbolRefExpr::VK_ARM_TPOFF:
|
||||
case MCSymbolRefExpr::VK_ARM_GOTTPOFF:
|
||||
case MCSymbolRefExpr::VK_Mips_TLSGD:
|
||||
case MCSymbolRefExpr::VK_Mips_GOTTPREL:
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_HI:
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_LO:
|
||||
break;
|
||||
}
|
||||
MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
|
||||
|
@ -26,6 +26,38 @@ STATISTIC(MCExprEvaluate, "Number of MCExpr evaluations");
|
||||
}
|
||||
}
|
||||
|
||||
static bool printMipsSymbolRef(const MCSymbolRefExpr &SRE,
|
||||
const MCSymbol &Sym, raw_ostream &OS) {
|
||||
MCSymbolRefExpr::VariantKind Kind= SRE.getKind();
|
||||
|
||||
switch (Kind) {
|
||||
default:
|
||||
return false;
|
||||
case MCSymbolRefExpr::VK_Mips_None: break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPREL: OS << "%gp_rel("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_CALL: OS << "%call16("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT: OS << "%got("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_ABS_HI: OS << "%hi("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_ABS_LO: OS << "%lo("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_TLSGD: OS << "%tlsgd("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOTTPREL: OS << "%gottprel("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_HI: OS << "%tprel_hi("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_LO: OS << "%tprel_lo("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPOFF_HI: OS << "%hi(%neg(%gp_rel("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPOFF_LO: OS << "%lo(%neg(%gp_rel("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_DISP: OS << "%got_disp("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_PAGE: OS << "%got_page("; break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_OFST: OS << "%got_ofst("; break;
|
||||
}
|
||||
|
||||
OS << Sym;
|
||||
|
||||
if (Kind != MCSymbolRefExpr::VK_Mips_None)
|
||||
OS << ')';
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MCExpr::print(raw_ostream &OS) const {
|
||||
switch (getKind()) {
|
||||
case MCExpr::Target:
|
||||
@ -41,6 +73,9 @@ void MCExpr::print(raw_ostream &OS) const {
|
||||
// absolute names.
|
||||
bool UseParens = Sym.getName()[0] == '$';
|
||||
|
||||
if (printMipsSymbolRef(SRE, Sym, OS))
|
||||
return;
|
||||
|
||||
if (SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_HA16 ||
|
||||
SRE.getKind() == MCSymbolRefExpr::VK_PPC_DARWIN_LO16) {
|
||||
OS << MCSymbolRefExpr::getVariantKindName(SRE.getKind());
|
||||
|
Loading…
Reference in New Issue
Block a user