Skip to content

Commit bc8ae31

Browse files
authored
Basic SuperH support (gimli-rs#762)
1 parent 975587b commit bc8ae31

File tree

5 files changed

+16
-0
lines changed

5 files changed

+16
-0
lines changed

src/common.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub enum Architecture {
3535
Sparc,
3636
Sparc32Plus,
3737
Sparc64,
38+
SuperH,
3839
Wasm32,
3940
Wasm64,
4041
Xtensa,
@@ -87,6 +88,7 @@ impl Architecture {
8788
Architecture::Wasm32 => Some(AddressSize::U32),
8889
Architecture::Wasm64 => Some(AddressSize::U64),
8990
Architecture::Xtensa => Some(AddressSize::U32),
91+
Architecture::SuperH => Some(AddressSize::U32),
9092
}
9193
}
9294
}

src/read/elf/file.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ where
279279
(elf::EM_SPARC32PLUS, false) => Architecture::Sparc32Plus,
280280
(elf::EM_SPARCV9, true) => Architecture::Sparc64,
281281
(elf::EM_XTENSA, false) => Architecture::Xtensa,
282+
(elf::EM_SH, false) => Architecture::SuperH,
282283
_ => Architecture::Unknown,
283284
}
284285
}

src/read/elf/relocation.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,11 @@ fn parse_relocation<Elf: FileHeader>(
434434
elf::R_SPARC_64 | elf::R_SPARC_UA64 => (K::Absolute, g, 64),
435435
_ => unknown,
436436
},
437+
elf::EM_SH => match r_type {
438+
elf::R_SH_DIR32 => (K::Absolute, g, 32),
439+
elf::R_SH_REL32 => (K::Relative, g, 32),
440+
_ => unknown,
441+
},
437442
elf::EM_XTENSA => match r_type {
438443
elf::R_XTENSA_32 => (K::Absolute, g, 32),
439444
elf::R_XTENSA_32_PCREL => (K::Relative, g, 32),

src/write/elf/object.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ impl<'a> Object<'a> {
150150
Architecture::Sparc => true,
151151
Architecture::Sparc32Plus => true,
152152
Architecture::Sparc64 => true,
153+
Architecture::SuperH => false,
153154
Architecture::Xtensa => true,
154155
_ => {
155156
return Err(Error(format!(
@@ -364,6 +365,11 @@ impl<'a> Object<'a> {
364365
(K::Absolute, _, 64) => elf::R_SPARC_UA64,
365366
_ => return unsupported_reloc(),
366367
},
368+
Architecture::SuperH => match (kind, encoding, size) {
369+
(K::Absolute, _, 32) => elf::R_SH_DIR32,
370+
(K::Relative, _, 32) => elf::R_SH_REL32,
371+
_ => return unsupported_reloc(),
372+
},
367373
Architecture::Xtensa => match (kind, encoding, size) {
368374
(K::Absolute, _, 32) => elf::R_XTENSA_32,
369375
(K::Relative, E::Generic, 32) => elf::R_XTENSA_32_PCREL,
@@ -582,6 +588,7 @@ impl<'a> Object<'a> {
582588
(Architecture::Sparc, None) => elf::EM_SPARC,
583589
(Architecture::Sparc32Plus, None) => elf::EM_SPARC32PLUS,
584590
(Architecture::Sparc64, None) => elf::EM_SPARCV9,
591+
(Architecture::SuperH, None) => elf::EM_SH,
585592
(Architecture::Xtensa, None) => elf::EM_XTENSA,
586593
_ => {
587594
return Err(Error(format!(

tests/round_trip/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ fn elf_any() {
286286
(Architecture::Sparc, Endianness::Big),
287287
(Architecture::Sparc32Plus, Endianness::Big),
288288
(Architecture::Sparc64, Endianness::Big),
289+
(Architecture::SuperH, Endianness::Big),
289290
(Architecture::Xtensa, Endianness::Little),
290291
]
291292
.iter()

0 commit comments

Comments
 (0)