Skip to content

Commit 57b06ce

Browse files
committed
[CHERIoT] Add an ELF flag for RISCV_CHERIOT.
1 parent aa5f9b7 commit 57b06ce

File tree

6 files changed

+46
-2
lines changed

6 files changed

+46
-2
lines changed

lld/ELF/Arch/RISCV.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ uint32_t RISCV::calcEFlags() const {
192192
if ((eflags & EF_RISCV_CAP_MODE) != (target & EF_RISCV_CAP_MODE))
193193
Err(ctx) << f
194194
<< ": cannot link object files with different EF_RISCV_CAP_MODE";
195+
196+
if ((eflags & EF_RISCV_CHERIOT) != (target & EF_RISCV_CHERIOT))
197+
Err(ctx) << f
198+
<< ": cannot link object files with different EF_RISCV_CHERIOT";
195199
}
196200

197201
return target;

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,7 @@ enum : unsigned {
702702
// CHERI-specific flags
703703
EF_RISCV_CHERIABI = 0x00010000,
704704
EF_RISCV_CAP_MODE = 0x00020000,
705+
EF_RISCV_CHERIOT = 0x00040000,
705706
};
706707

707708
// ELF Relocation types for RISC-V

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,
555555
BCase(EF_RISCV_TSO);
556556
BCase(EF_RISCV_CHERIABI);
557557
BCase(EF_RISCV_CAP_MODE);
558+
BCase(EF_RISCV_CHERIOT);
558559
break;
559560
case ELF::EM_SPARC32PLUS:
560561
BCase(EF_SPARC_32PLUS);

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ void RISCVTargetELFStreamer::finish() {
103103
case RISCVABI::ABI_ILP32:
104104
case RISCVABI::ABI_LP64:
105105
break;
106-
case RISCVABI::ABI_IL32PC64:
107-
case RISCVABI::ABI_L64PC128:
108106
case RISCVABI::ABI_CHERIOT:
109107
case RISCVABI::ABI_CHERIOT_BAREMETAL:
108+
EFlags |= ELF::EF_RISCV_RVE;
109+
EFlags |= ELF::EF_RISCV_CHERIABI;
110+
EFlags |= ELF::EF_RISCV_CHERIOT;
111+
break;
112+
case RISCVABI::ABI_IL32PC64:
113+
case RISCVABI::ABI_L64PC128:
110114
EFlags |= ELF::EF_RISCV_CHERIABI;
111115
break;
112116
case RISCVABI::ABI_ILP32F:
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: llc --filetype=obj --mcpu=cheriot --mtriple=riscv32-unknown-unknown -target-abi cheriot %s -mattr=+xcheri,+cap-mode -o - | llvm-readelf -a - | FileCheck %s
2+
3+
; CHECK-LABEL: ELF Header:
4+
; CHECK: Flags: 0x70009, RVC, RVE, cheriabi, capability mode, cheriot
5+
6+
target datalayout = "e-m:e-pf200:64:64:64:32-p:32:32-i64:64-n32-S128-A200-P200-G200"
7+
target triple = "riscv32cheriot-unknown-cheriotrtos"
8+
9+
10+
define void @foo() addrspace(200) #0 {
11+
entry:
12+
ret void
13+
}
14+
15+
attributes #0 = { minsize mustprogress nounwind optsize "frame-pointer"="none" "min-legal-vector-width"="0" "no-builtins" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cheriot" "target-features"="+relax,+xcheri,-64bit,-save-restore" }
16+
17+
!llvm.linker.options = !{}
18+
!llvm.module.flags = !{!0, !1, !2}
19+
!llvm.ident = !{!3}
20+
21+
!0 = !{i32 1, !"wchar_size", i32 2}
22+
!1 = !{i32 1, !"target-abi", !"cheriot"}
23+
!2 = !{i32 1, !"SmallDataLimit", i32 8}
24+
!3 = !{!"clang version 13.0.0 (ssh://[email protected]/CHERIoT-Platform/llvm-project 42ccdb1bcc7eb0bf8cc8e493850359f828515495)"}
25+
!4 = !{i64 0, i64 4, !5, i64 4, i64 4, !5, i64 8, i64 4, !5}
26+
!5 = !{!6, !6, i64 0}
27+
!6 = !{!"int", !7, i64 0}
28+
!7 = !{!"omnipotent char", !8, i64 0}
29+
!8 = !{!"Simple C++ TBAA"}
30+
!9 = !{i64 0, i64 128, !10}
31+
!10 = !{!7, !7, i64 0}
32+

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,6 +1696,8 @@ const EnumEntry<unsigned> ElfHeaderRISCVFlags[] = {
16961696
ENUM_ENT(EF_RISCV_TSO, "TSO"),
16971697
ENUM_ENT(EF_RISCV_CHERIABI, "cheriabi"),
16981698
ENUM_ENT(EF_RISCV_CAP_MODE, "capability mode"),
1699+
ENUM_ENT(EF_RISCV_CHERIOT, "cheriot"),
1700+
16991701
};
17001702

17011703
const EnumEntry<unsigned> ElfHeaderSPARCFlags[] = {

0 commit comments

Comments
 (0)