Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
Inst.clear();
Inst.addOperand(MCOperand::createExpr(RISCVMCExpr::create(
MCSymbolRefExpr::create(Target, MCSymbolRefExpr::VK_None, *Ctx),
RISCVMCExpr::VK_CALL, *Ctx)));
ELF::R_RISCV_CALL_PLT, *Ctx)));
}

void createCall(MCInst &Inst, const MCSymbol *Target,
Expand Down Expand Up @@ -435,19 +435,19 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
case ELF::R_RISCV_TLS_GD_HI20:
// The GOT is reused so no need to create GOT relocations
case ELF::R_RISCV_PCREL_HI20:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_PCREL_HI, Ctx);
return RISCVMCExpr::create(Expr, ELF::R_RISCV_PCREL_HI20, Ctx);
case ELF::R_RISCV_PCREL_LO12_I:
case ELF::R_RISCV_PCREL_LO12_S:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_PCREL_LO, Ctx);
case ELF::R_RISCV_HI20:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_HI, Ctx);
return RISCVMCExpr::create(Expr, ELF::R_RISCV_HI20, Ctx);
case ELF::R_RISCV_LO12_I:
case ELF::R_RISCV_LO12_S:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_LO, Ctx);
case ELF::R_RISCV_CALL:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_CALL, Ctx);
return RISCVMCExpr::create(Expr, ELF::R_RISCV_CALL_PLT, Ctx);
case ELF::R_RISCV_CALL_PLT:
return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_CALL_PLT, Ctx);
return RISCVMCExpr::create(Expr, ELF::R_RISCV_CALL_PLT, Ctx);
}
}

Expand All @@ -472,8 +472,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
switch (cast<RISCVMCExpr>(ImmExpr)->getSpecifier()) {
default:
return false;
case RISCVMCExpr::VK_CALL:
case RISCVMCExpr::VK_CALL_PLT:
case ELF::R_RISCV_CALL_PLT:
return true;
}
}
Expand Down
35 changes: 17 additions & 18 deletions llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
(VK == RISCVMCExpr::VK_CALL || VK == RISCVMCExpr::VK_CALL_PLT);
VK == ELF::R_RISCV_CALL_PLT;
}

bool isPseudoJumpSymbol() const {
Expand All @@ -594,7 +594,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
VK == RISCVMCExpr::VK_CALL;
VK == ELF::R_RISCV_CALL_PLT;
}

bool isTPRelAddSymbol() const {
Expand All @@ -605,7 +605,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
VK == RISCVMCExpr::VK_TPREL_ADD;
VK == ELF::R_RISCV_TPREL_ADD;
}

bool isTLSDESCCallSymbol() const {
Expand All @@ -616,7 +616,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
VK == RISCVMCExpr::VK_TLSDESC_CALL;
VK == ELF::R_RISCV_TLSDESC_CALL;
}

bool isCSRSystemRegister() const { return isSystemRegister(); }
Expand Down Expand Up @@ -868,8 +868,8 @@ struct RISCVOperand final : public MCParsedAsmOperand {
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
(VK == RISCVMCExpr::VK_LO || VK == RISCVMCExpr::VK_PCREL_LO ||
VK == RISCVMCExpr::VK_TPREL_LO ||
VK == RISCVMCExpr::VK_TLSDESC_LOAD_LO ||
VK == RISCVMCExpr::VK_TLSDESC_ADD_LO);
VK == ELF::R_RISCV_TLSDESC_LOAD_LO12 ||
VK == ELF::R_RISCV_TLSDESC_ADD_LO12);
}

bool isSImm12Lsb00000() const {
Expand Down Expand Up @@ -912,7 +912,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
(VK == RISCVMCExpr::VK_HI || VK == RISCVMCExpr::VK_TPREL_HI);
(VK == ELF::R_RISCV_HI20 || VK == ELF::R_RISCV_TPREL_HI20);
}

bool isUImm20AUIPC() const {
Expand All @@ -925,10 +925,9 @@ struct RISCVOperand final : public MCParsedAsmOperand {

RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
return RISCVAsmParser::classifySymbolRef(getImm(), VK) &&
(VK == RISCVMCExpr::VK_PCREL_HI || VK == RISCVMCExpr::VK_GOT_HI ||
VK == RISCVMCExpr::VK_TLS_GOT_HI ||
VK == RISCVMCExpr::VK_TLS_GD_HI ||
VK == RISCVMCExpr::VK_TLSDESC_HI);
(VK == ELF::R_RISCV_PCREL_HI20 || VK == ELF::R_RISCV_GOT_HI20 ||
VK == ELF::R_RISCV_TLS_GOT_HI20 || VK == ELF::R_RISCV_TLS_GD_HI20 ||
VK == ELF::R_RISCV_TLSDESC_HI20);
}

bool isImmZero() const {
Expand Down Expand Up @@ -2168,7 +2167,7 @@ ParseStatus RISCVAsmParser::parseCallSymbol(OperandVector &Operands) {
}

SMLoc E = SMLoc::getFromPointer(S.getPointer() + Identifier.size());
RISCVMCExpr::Specifier Kind = RISCVMCExpr::VK_CALL_PLT;
RISCVMCExpr::Specifier Kind = ELF::R_RISCV_CALL_PLT;

MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier);
Res = MCSymbolRefExpr::create(Sym, getContext());
Expand All @@ -2188,7 +2187,7 @@ ParseStatus RISCVAsmParser::parsePseudoJumpSymbol(OperandVector &Operands) {
if (Res->getKind() != MCExpr::ExprKind::SymbolRef)
return Error(S, "operand must be a valid jump target");

Res = RISCVMCExpr::create(Res, RISCVMCExpr::VK_CALL, getContext());
Res = RISCVMCExpr::create(Res, ELF::R_RISCV_CALL_PLT, getContext());
Operands.push_back(RISCVOperand::createImm(Res, S, E, isRV64()));
return ParseStatus::Success;
}
Expand Down Expand Up @@ -3409,7 +3408,7 @@ void RISCVAsmParser::emitLoadLocalAddress(MCInst &Inst, SMLoc IDLoc,
// ADDI rdest, rdest, %pcrel_lo(TmpLabel)
MCRegister DestReg = Inst.getOperand(0).getReg();
const MCExpr *Symbol = Inst.getOperand(1).getExpr();
emitAuipcInstPair(DestReg, DestReg, Symbol, RISCVMCExpr::VK_PCREL_HI,
emitAuipcInstPair(DestReg, DestReg, Symbol, ELF::R_RISCV_PCREL_HI20,
RISCV::ADDI, IDLoc, Out);
}

Expand All @@ -3424,7 +3423,7 @@ void RISCVAsmParser::emitLoadGlobalAddress(MCInst &Inst, SMLoc IDLoc,
MCRegister DestReg = Inst.getOperand(0).getReg();
const MCExpr *Symbol = Inst.getOperand(1).getExpr();
unsigned SecondOpcode = isRV64() ? RISCV::LD : RISCV::LW;
emitAuipcInstPair(DestReg, DestReg, Symbol, RISCVMCExpr::VK_GOT_HI,
emitAuipcInstPair(DestReg, DestReg, Symbol, ELF::R_RISCV_GOT_HI20,
SecondOpcode, IDLoc, Out);
}

Expand Down Expand Up @@ -3454,7 +3453,7 @@ void RISCVAsmParser::emitLoadTLSIEAddress(MCInst &Inst, SMLoc IDLoc,
MCRegister DestReg = Inst.getOperand(0).getReg();
const MCExpr *Symbol = Inst.getOperand(1).getExpr();
unsigned SecondOpcode = isRV64() ? RISCV::LD : RISCV::LW;
emitAuipcInstPair(DestReg, DestReg, Symbol, RISCVMCExpr::VK_TLS_GOT_HI,
emitAuipcInstPair(DestReg, DestReg, Symbol, ELF::R_RISCV_TLS_GOT_HI20,
SecondOpcode, IDLoc, Out);
}

Expand All @@ -3468,7 +3467,7 @@ void RISCVAsmParser::emitLoadTLSGDAddress(MCInst &Inst, SMLoc IDLoc,
// ADDI rdest, rdest, %pcrel_lo(TmpLabel)
MCRegister DestReg = Inst.getOperand(0).getReg();
const MCExpr *Symbol = Inst.getOperand(1).getExpr();
emitAuipcInstPair(DestReg, DestReg, Symbol, RISCVMCExpr::VK_TLS_GD_HI,
emitAuipcInstPair(DestReg, DestReg, Symbol, ELF::R_RISCV_TLS_GD_HI20,
RISCV::ADDI, IDLoc, Out);
}

Expand All @@ -3494,7 +3493,7 @@ void RISCVAsmParser::emitLoadStoreSymbol(MCInst &Inst, unsigned Opcode,
}

const MCExpr *Symbol = Inst.getOperand(SymbolOpIdx).getExpr();
emitAuipcInstPair(DestReg, TmpReg, Symbol, RISCVMCExpr::VK_PCREL_HI, Opcode,
emitAuipcInstPair(DestReg, TmpReg, Symbol, ELF::R_RISCV_PCREL_HI20, Opcode,
IDLoc, Out);
}

Expand Down
27 changes: 12 additions & 15 deletions llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
unsigned Kind = Fixup.getTargetKind();
auto Spec = RISCVMCExpr::Specifier(Target.getSpecifier());
switch (Spec) {
case RISCVMCExpr::VK_TPREL_HI:
case RISCVMCExpr::VK_TLS_GOT_HI:
case RISCVMCExpr::VK_TLS_GD_HI:
case RISCVMCExpr::VK_TLSDESC_HI:
case ELF::R_RISCV_TPREL_HI20:
case ELF::R_RISCV_TLS_GOT_HI20:
case ELF::R_RISCV_TLS_GD_HI20:
case ELF::R_RISCV_TLSDESC_HI20:
if (auto *SA = Target.getAddSym())
cast<MCSymbolELF>(SA)->setType(ELF::STT_TLS);
break;
case RISCVMCExpr::VK_PLTPCREL:
case RISCVMCExpr::VK_GOTPCREL:
case ELF::R_RISCV_PLT32:
case ELF::R_RISCV_GOT32_PCREL:
if (Kind == FK_Data_4)
break;
Ctx.reportError(Fixup.getLoc(),
Expand Down Expand Up @@ -124,15 +124,12 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_RISCV_NONE;
case FK_Data_4:
if (Expr->getKind() == MCExpr::Target) {
switch (cast<RISCVMCExpr>(Expr)->getSpecifier()) {
case RISCVMCExpr::VK_32_PCREL:
return ELF::R_RISCV_32_PCREL;
case RISCVMCExpr::VK_GOTPCREL:
return ELF::R_RISCV_GOT32_PCREL;
case RISCVMCExpr::VK_PLTPCREL:
return ELF::R_RISCV_PLT32;
default:
break;
auto Spec = cast<RISCVMCExpr>(Expr)->getSpecifier();
switch (Spec) {
case ELF::R_RISCV_32_PCREL:
case ELF::R_RISCV_GOT32_PCREL:
case ELF::R_RISCV_PLT32:
return Spec;
}
}
return ELF::R_RISCV_32;
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "RISCVMCAsmInfo.h"
#include "MCTargetDesc/RISCVMCExpr.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/TargetParser/Triple.h"
Expand Down Expand Up @@ -44,5 +45,5 @@ const MCExpr *RISCVMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
MCContext &Ctx = Streamer.getContext();
const MCExpr *ME = MCSymbolRefExpr::create(Sym, Ctx);
assert(Encoding & dwarf::DW_EH_PE_sdata4 && "Unexpected encoding");
return RISCVMCExpr::create(ME, RISCVMCExpr::VK_32_PCREL, Ctx);
return RISCVMCExpr::create(ME, ELF::R_RISCV_32_PCREL, Ctx);
}
51 changes: 12 additions & 39 deletions llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ void RISCVMCCodeEmitter::expandAddTPRel(const MCInst &MI,
"Expected expression as third input to TP-relative add");

const RISCVMCExpr *Expr = dyn_cast<RISCVMCExpr>(SrcSymbol.getExpr());
assert(Expr && Expr->getSpecifier() == RISCVMCExpr::VK_TPREL_ADD &&
assert(Expr && Expr->getSpecifier() == ELF::R_RISCV_TPREL_ADD &&
"Expected tprel_add relocation on TP-relative symbol");

// Emit the correct tprel_add relocation for the symbol.
Expand Down Expand Up @@ -573,20 +573,19 @@ uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
bool RelaxCandidate = false;
if (Kind == MCExpr::Target) {
const RISCVMCExpr *RVExpr = cast<RISCVMCExpr>(Expr);

FixupKind = RVExpr->getSpecifier();
switch (RVExpr->getSpecifier()) {
case RISCVMCExpr::VK_None:
case RISCVMCExpr::VK_32_PCREL:
case RISCVMCExpr::VK_GOTPCREL:
case RISCVMCExpr::VK_PLTPCREL:
llvm_unreachable("unhandled specifier");
case RISCVMCExpr::VK_TPREL_ADD:
default:
assert(FixupKind && FixupKind < FirstTargetFixupKind &&
"invalid specifier");
break;
case ELF::R_RISCV_TPREL_ADD:
// tprel_add is only used to indicate that a relocation should be emitted
// for an add instruction used in TP-relative addressing. It should not be
// expanded as if representing an actual instruction operand and so to
// encounter it here is an error.
llvm_unreachable(
"VK_TPREL_ADD should not represent an instruction operand");
"ELF::R_RISCV_TPREL_ADD should not represent an instruction operand");
case RISCVMCExpr::VK_LO:
if (MIFrm == RISCVII::InstFormatI)
FixupKind = RISCV::fixup_riscv_lo12_i;
Expand All @@ -596,7 +595,7 @@ uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
llvm_unreachable("VK_LO used with unexpected instruction format");
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_HI:
case ELF::R_RISCV_HI20:
FixupKind = RISCV::fixup_riscv_hi20;
RelaxCandidate = true;
break;
Expand All @@ -609,13 +608,10 @@ uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
llvm_unreachable("VK_PCREL_LO used with unexpected instruction format");
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_PCREL_HI:
case ELF::R_RISCV_PCREL_HI20:
FixupKind = RISCV::fixup_riscv_pcrel_hi20;
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_GOT_HI:
FixupKind = ELF::R_RISCV_GOT_HI20;
break;
case RISCVMCExpr::VK_TPREL_LO:
if (MIFrm == RISCVII::InstFormatI)
FixupKind = ELF::R_RISCV_TPREL_LO12_I;
Expand All @@ -625,36 +621,13 @@ uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
llvm_unreachable("VK_TPREL_LO used with unexpected instruction format");
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_TPREL_HI:
FixupKind = ELF::R_RISCV_TPREL_HI20;
case ELF::R_RISCV_TPREL_HI20:
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_TLS_GOT_HI:
FixupKind = ELF::R_RISCV_TLS_GOT_HI20;
break;
case RISCVMCExpr::VK_TLS_GD_HI:
FixupKind = ELF::R_RISCV_TLS_GD_HI20;
break;
case RISCVMCExpr::VK_CALL:
FixupKind = RISCV::fixup_riscv_call;
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_CALL_PLT:
case ELF::R_RISCV_CALL_PLT:
FixupKind = RISCV::fixup_riscv_call_plt;
RelaxCandidate = true;
break;
case RISCVMCExpr::VK_TLSDESC_HI:
FixupKind = ELF::R_RISCV_TLSDESC_HI20;
break;
case RISCVMCExpr::VK_TLSDESC_LOAD_LO:
FixupKind = ELF::R_RISCV_TLSDESC_LOAD_LO12;
break;
case RISCVMCExpr::VK_TLSDESC_ADD_LO:
FixupKind = ELF::R_RISCV_TLSDESC_ADD_LO12;
break;
case RISCVMCExpr::VK_TLSDESC_CALL:
FixupKind = ELF::R_RISCV_TLSDESC_CALL;
break;
case RISCVMCExpr::VK_QC_ABS20:
FixupKind = RISCV::fixup_riscv_qc_abs20_u;
break;
Expand Down
Loading
Loading