Skip to content

Commit 39c2a73

Browse files
jrtc27resistor
authored andcommitted
[RISCV] Add MC support for .chericap %code(expr)
1 parent 5a899bb commit 39c2a73

File tree

3 files changed

+6
-1
lines changed

3 files changed

+6
-1
lines changed

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5844,7 +5844,7 @@ bool AsmParser::parseDirectiveCheriCap(SMLoc DirectiveLoc) {
58445844
if (!getTargetParser().isCheri())
58455845
return Error(DirectiveLoc, "'.chericap' requires CHERI");
58465846

5847-
if (parseExpression(Expr))
5847+
if (getTargetParser().parseDataExpr(Expr))
58485848
return true;
58495849

58505850
int64_t Value;

llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ unsigned RISCVELFObjectWriter::getRelocType(const MCFixup &Fixup,
166166
}
167167
goto CheriCapability;
168168
CheriCapability:
169+
if (Fixup.getValue()->getKind() == ELF::R_RISCV_CHERI_CAPABILITY_CODE)
170+
return ELF::R_RISCV_CHERI_CAPABILITY_CODE;
169171
return ELF::R_RISCV_CHERI_CAPABILITY;
170172
case RISCV::fixup_riscv_cheriot_compartment_hi:
171173
return ELF::R_RISCV_CHERIOT_COMPARTMENT_HI;

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ RISCV::Specifier RISCV::parseSpecifierName(StringRef name) {
5050
.Case("cheriot_compartment_lo_i", RISCV::S_CHERIOT_COMPARTMENT_LO_I)
5151
.Case("cheriot_compartment_lo_s", RISCV::S_CHERIOT_COMPARTMENT_LO_S)
5252
.Case("cheriot_compartment_size", RISCV::S_CHERIOT_COMPARTMENT_SIZE)
53+
.Case("code", ELF::R_RISCV_CHERI_CAPABILITY_CODE)
5354
.Default(0);
5455
}
5556

@@ -105,6 +106,8 @@ StringRef RISCV::getSpecifierName(Specifier S) {
105106
return "pltpcrel";
106107
case RISCV::S_QC_ABS20:
107108
return "qc.abs20";
109+
case ELF::R_RISCV_CHERI_CAPABILITY_CODE:
110+
return "code";
108111
}
109112
llvm_unreachable("Invalid ELF symbol kind");
110113
}

0 commit comments

Comments
 (0)