diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index 3ab22d67da..f40a758221 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -29,6 +29,7 @@ pub struct ObjectBuilder { isa: Box, binary_format: object::BinaryFormat, architecture: object::Architecture, + flags: object::FileFlags, endian: object::Endianness, name: Vec, libcall_names: Box String + Send + Sync>, @@ -48,6 +49,7 @@ impl ObjectBuilder { name: V, libcall_names: Box String + Send + Sync>, ) -> ModuleResult { + let mut file_flags = object::FileFlags::None; let binary_format = match isa.triple().binary_format { target_lexicon::BinaryFormat::Elf => object::BinaryFormat::Elf, target_lexicon::BinaryFormat::Coff => object::BinaryFormat::Coff, @@ -72,7 +74,21 @@ impl ObjectBuilder { target_lexicon::Architecture::X86_64 => object::Architecture::X86_64, target_lexicon::Architecture::Arm(_) => object::Architecture::Arm, target_lexicon::Architecture::Aarch64(_) => object::Architecture::Aarch64, - target_lexicon::Architecture::Riscv64(_) => object::Architecture::Riscv64, + target_lexicon::Architecture::Riscv64(_) => { + if binary_format != object::BinaryFormat::Elf { + return Err(ModuleError::Backend(anyhow!( + "binary format {:?} is not supported for riscv64", + binary_format, + ))); + } + // FIXME(#4994) get the right variant from the TargetIsa + file_flags = object::FileFlags::Elf { + os_abi: object::elf::ELFOSABI_NONE, + abi_version: 0, + e_flags: object::elf::EF_RISCV_RVC | object::elf::EF_RISCV_FLOAT_ABI_DOUBLE, + }; + object::Architecture::Riscv64 + } target_lexicon::Architecture::S390x => object::Architecture::S390x, architecture => { return Err(ModuleError::Backend(anyhow!( @@ -89,6 +105,7 @@ impl ObjectBuilder { isa, binary_format, architecture, + flags: file_flags, endian, name: name.into(), libcall_names, @@ -125,6 +142,7 @@ impl ObjectModule { /// Create a new `ObjectModule` using the given Cranelift target. pub fn new(builder: ObjectBuilder) -> Self { let mut object = Object::new(builder.binary_format, builder.architecture, builder.endian); + object.flags = builder.flags; object.add_file_symbol(builder.name); Self { isa: builder.isa, @@ -690,6 +708,18 @@ impl ObjectModule { 0, ) } + Reloc::RiscvCall => { + assert_eq!( + self.object.format(), + object::BinaryFormat::Elf, + "RiscvCall is not supported for this file format" + ); + ( + RelocationKind::Elf(object::elf::R_RISCV_CALL), + RelocationEncoding::Generic, + 0, + ) + } // FIXME reloc => unimplemented!("{:?}", reloc), };