Skip to content

Commit a86debb

Browse files
authored
Add missing riscv attributes (#560)
* Add missing riscv attributes - Based on RISCV ELF psABI document: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/2092568f7896ceaa1ec0f02569b19eaa42cd51c9/riscv-elf.adoc?plain=1#L1174 Signed-off-by: Jerry Zhang Jian <[email protected]> * Add test for more riscv attribute Signed-off-by: Jerry Zhang Jian <[email protected]> --------- Signed-off-by: Jerry Zhang Jian <[email protected]>
1 parent 433da27 commit a86debb

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

elftools/elf/descriptions.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,11 @@ def _reverse_dict(d, low_priority=()):
10131013
TAG_STACK_ALIGN='Tag_RISCV_stack_align: ',
10141014
TAG_ARCH='Tag_RISCV_arch: ',
10151015
TAG_UNALIGNED='Tag_RISCV_unaligned_access: ',
1016+
TAG_PRIV_SPEC='Tag_RISCV_priv_spec: ',
1017+
TAG_PRIV_SPEC_MINOR='Tag_RISCV_priv_spec_minor: ',
1018+
TAG_PRIV_SPEC_REVISION='Tag_RISCV_priv_spec_revision: ',
1019+
TAG_ATOMIC_ABI='Tag_RISCV_atomic_abi: ',
1020+
TAG_X3_REG_USAGE='Tag_RISCV_x3_reg_usage: ',
10161021
)
10171022

10181023
_DESCR_ATTR_VAL_RISCV = [
@@ -1028,4 +1033,19 @@ def _reverse_dict(d, low_priority=()):
10281033
0: 'Not Allowed',
10291034
1: 'Allowed',
10301035
},
1036+
None, #8 TAG_RISCV_priv_spec
1037+
None, #10 TAG_RISCV_priv_spec_minor
1038+
None, #12 TAG_RISCV_priv_spec_revision
1039+
{ #14 TAG_RISCV_atomic_abi
1040+
0: 'UNKNOWN: This object uses unknown atomic ABI.',
1041+
1: 'A6C: This object uses the A6 classical atomic ABI.',
1042+
2: 'A6S: This object uses the strengthened A6 ABI.',
1043+
3: 'A7: This object uses the A7 atomic ABI.'
1044+
},
1045+
{ #16 TAG_RISCV_x3_reg_usage
1046+
0: 'This object uses x3 as a fixed register with unknown purpose.',
1047+
1: 'This object uses x3 as the global pointer, for relaxation purposes.',
1048+
2: 'This object uses x3 as the shadow stack pointer.',
1049+
3: 'This object uses X3 as a temporary register.',
1050+
},
10311051
]

elftools/elf/enums.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,11 @@
13891389
TAG_STACK_ALIGN=4,
13901390
TAG_ARCH=5,
13911391
TAG_UNALIGNED_ACCESS=6,
1392+
TAG_PRIV_SPEC=8,
1393+
TAG_PRIV_SPEC_MINOR=10,
1394+
TAG_PRIV_SPEC_REVISION=12,
1395+
TAG_ATOMIC_ABI=14,
1396+
TAG_X3_REG_USAGE=16,
13921397
)
13931398

13941399
# https://openpowerfoundation.org/wp-content/uploads/2016/03/ABI64BitOpenPOWERv1.1_16July2015_pub4.pdf

test/test_riscv_support.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,32 @@ def test_build_attributes(self):
4343
for i in subsubsec.iter_attributes('TAG_ARCH'):
4444
self.assertEqual(i.value, 'rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0_v1p0_zfh1p0_zfhmin1p0_zba1p0_zbb1p0_zbc1p0_zbs1p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0')
4545

46+
with open(os.path.join('test', 'testfiles_for_unittests',
47+
'simple_clang.elf.riscv'), 'rb') as f:
48+
elf = ELFFile(f)
49+
50+
sec = elf.get_section_by_name('.riscv.attributes')
51+
self.assertEqual(sec['sh_type'], 'SHT_RISCV_ATTRIBUTES')
52+
self.assertEqual(sec.num_subsections, 1)
53+
54+
subsec = sec.subsections[0]
55+
self.assertEqual(subsec.header['vendor_name'], 'riscv')
56+
self.assertEqual(subsec.num_subsubsections, 1)
57+
58+
subsubsec = subsec.subsubsections[0]
59+
self.assertEqual(subsubsec.header.tag, 'TAG_FILE')
60+
61+
for i in subsubsec.iter_attributes('TAG_STACK_ALIGN'):
62+
self.assertEqual(i.value, 16)
63+
64+
for i in subsubsec.iter_attributes('TAG_ARCH'):
65+
self.assertEqual(i.value, 'rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_v1p0_zicsr2p0_zifencei2p0_zmmul1p0_zfh1p0_zba1p0_zbb1p0_zbc1p0_zbs1p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0')
66+
67+
for i in subsubsec.iter_attributes('TAG_PRIV_SPEC'):
68+
self.assertEqual(i.value, 1)
69+
70+
for i in subsubsec.iter_attributes('TAG_PRIV_SPEC_MINOR'):
71+
self.assertEqual(i.value, 11)
72+
4673
if __name__ == '__main__':
4774
unittest.main()
Binary file not shown.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Compiled using https://github.com/riscv-collab/riscv-gnu-toolchain with
3+
* multilib support enabled.
4+
*
5+
* riscv64-unknown-linux-gnu-clang -march=rv64gcv_zba_zbb_zbc_zbs_zfh -static simple_clang.riscv.c -o simple_clang.elf.riscv
6+
*/
7+
8+
int main()
9+
{
10+
return 42;
11+
}

0 commit comments

Comments
 (0)