From f4c4a84b84ea20737d2a7e5b86776cf75a0e48d7 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Tue, 31 Mar 2020 12:04:34 +0200 Subject: [PATCH] cranelift codegen: pass source locations with external relocations; --- .../codegen/meta/src/isa/riscv/recipes.rs | 3 +- cranelift/codegen/meta/src/isa/x86/recipes.rs | 45 ++++++++++++------- cranelift/codegen/src/binemit/memorysink.rs | 33 +++++++++++--- cranelift/codegen/src/binemit/mod.rs | 2 +- cranelift/faerie/src/backend.rs | 1 + cranelift/filetests/src/test_binemit.rs | 1 + cranelift/filetests/src/test_compile.rs | 1 + cranelift/filetests/src/test_rodata.rs | 9 +++- cranelift/object/src/backend.rs | 1 + cranelift/simplejit/src/backend.rs | 1 + cranelift/src/disasm.rs | 1 + crates/environ/src/cranelift.rs | 1 + crates/jit/src/compiler.rs | 1 + crates/jit/src/trampoline.rs | 1 + crates/lightbeam/src/backend.rs | 2 + crates/lightbeam/src/translate_sections.rs | 1 + 16 files changed, 80 insertions(+), 24 deletions(-) diff --git a/cranelift/codegen/meta/src/isa/riscv/recipes.rs b/cranelift/codegen/meta/src/isa/riscv/recipes.rs index a75e42c236..1036d15566 100644 --- a/cranelift/codegen/meta/src/isa/riscv/recipes.rs +++ b/cranelift/codegen/meta/src/isa/riscv/recipes.rs @@ -205,7 +205,8 @@ pub(crate) fn define(shared_defs: &SharedDefinitions, regs: &IsaRegs) -> RecipeG recipes.push(EncodingRecipeBuilder::new("UJcall", &formats.call, 4).emit( r#" - sink.reloc_external(Reloc::RiscvCall, + sink.reloc_external(func.srclocs[inst], + Reloc::RiscvCall, &func.dfg.ext_funcs[func_ref].name, 0); // rd=%x1 is the standard link register. diff --git a/cranelift/codegen/meta/src/isa/x86/recipes.rs b/cranelift/codegen/meta/src/isa/x86/recipes.rs index 98bdf31f55..d4fea0a9b1 100644 --- a/cranelift/codegen/meta/src/isa/x86/recipes.rs +++ b/cranelift/codegen/meta/src/isa/x86/recipes.rs @@ -1258,7 +1258,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs4, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs4, &func.dfg.ext_funcs[func_ref].name, 0); sink.put4(0); @@ -1273,7 +1274,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs8, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs8, &func.dfg.ext_funcs[func_ref].name, 0); sink.put8(0); @@ -1288,7 +1290,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs4, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs4, &func.dfg.ext_funcs[func_ref].name, 0); // Write the immediate as `!0` for the benefit of BaldrMonkey. @@ -1304,7 +1307,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs8, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs8, &func.dfg.ext_funcs[func_ref].name, 0); // Write the immediate as `!0` for the benefit of BaldrMonkey. @@ -1324,7 +1328,8 @@ pub(crate) fn define<'shared>( modrm_riprel(out_reg0, sink); // The addend adjusts for the difference between the end of the // instruction and the beginning of the immediate field. - sink.reloc_external(Reloc::X86PCRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86PCRel4, &func.dfg.ext_funcs[func_ref].name, -4); sink.put4(0); @@ -1343,7 +1348,8 @@ pub(crate) fn define<'shared>( modrm_riprel(out_reg0, sink); // The addend adjusts for the difference between the end of the // instruction and the beginning of the immediate field. - sink.reloc_external(Reloc::X86GOTPCRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86GOTPCRel4, &func.dfg.ext_funcs[func_ref].name, -4); sink.put4(0); @@ -1358,7 +1364,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs4, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs4, &func.global_values[global_value].symbol_name(), 0); sink.put4(0); @@ -1373,7 +1380,8 @@ pub(crate) fn define<'shared>( .emit( r#" {{PUT_OP}}(bits | (out_reg0 & 7), rex1(out_reg0), sink); - sink.reloc_external(Reloc::Abs8, + sink.reloc_external(func.srclocs[inst], + Reloc::Abs8, &func.global_values[global_value].symbol_name(), 0); sink.put8(0); @@ -1391,7 +1399,8 @@ pub(crate) fn define<'shared>( modrm_rm(5, out_reg0, sink); // The addend adjusts for the difference between the end of the // instruction and the beginning of the immediate field. - sink.reloc_external(Reloc::X86PCRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86PCRel4, &func.global_values[global_value].symbol_name(), -4); sink.put4(0); @@ -1409,7 +1418,8 @@ pub(crate) fn define<'shared>( modrm_rm(5, out_reg0, sink); // The addend adjusts for the difference between the end of the // instruction and the beginning of the immediate field. - sink.reloc_external(Reloc::X86GOTPCRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86GOTPCRel4, &func.global_values[global_value].symbol_name(), -4); sink.put4(0); @@ -2402,7 +2412,8 @@ pub(crate) fn define<'shared>( {{PUT_OP}}(bits, BASE_REX, sink); // The addend adjusts for the difference between the end of the // instruction and the beginning of the immediate field. - sink.reloc_external(Reloc::X86CallPCRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86CallPCRel4, &func.dfg.ext_funcs[func_ref].name, -4); sink.put4(0); @@ -2415,7 +2426,8 @@ pub(crate) fn define<'shared>( r#" sink.trap(TrapCode::StackOverflow, func.srclocs[inst]); {{PUT_OP}}(bits, BASE_REX, sink); - sink.reloc_external(Reloc::X86CallPLTRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86CallPLTRel4, &func.dfg.ext_funcs[func_ref].name, -4); sink.put4(0); @@ -3320,7 +3332,8 @@ pub(crate) fn define<'shared>( const LEA: u8 = 0x8d; sink.put1(LEA); // lea modrm_riprel(0b111/*out_reg0*/, sink); // 0x3d - sink.reloc_external(Reloc::ElfX86_64TlsGd, + sink.reloc_external(func.srclocs[inst], + Reloc::ElfX86_64TlsGd, &func.global_values[global_value].symbol_name(), -4); sink.put4(0); @@ -3330,7 +3343,8 @@ pub(crate) fn define<'shared>( sink.put1(0x66); // data16 sink.put1(0b01001000); // rex.w sink.put1(0xe8); // call - sink.reloc_external(Reloc::X86CallPLTRel4, + sink.reloc_external(func.srclocs[inst], + Reloc::X86CallPLTRel4, &ExternalName::LibCall(LibCall::ElfTlsGetAddr), -4); sink.put4(0); @@ -3351,7 +3365,8 @@ pub(crate) fn define<'shared>( sink.put1(0x48); // rex sink.put1(0x8b); // mov modrm_riprel(0b111/*out_reg0*/, sink); // 0x3d - sink.reloc_external(Reloc::MachOX86_64Tlv, + sink.reloc_external(func.srclocs[inst], + Reloc::MachOX86_64Tlv, &func.global_values[global_value].symbol_name(), -4); sink.put4(0); diff --git a/cranelift/codegen/src/binemit/memorysink.rs b/cranelift/codegen/src/binemit/memorysink.rs index a9d386d2c0..45b73131f8 100644 --- a/cranelift/codegen/src/binemit/memorysink.rs +++ b/cranelift/codegen/src/binemit/memorysink.rs @@ -78,7 +78,14 @@ pub trait RelocSink { fn reloc_block(&mut self, _: CodeOffset, _: Reloc, _: CodeOffset); /// Add a relocation referencing an external symbol at the current offset. - fn reloc_external(&mut self, _: CodeOffset, _: Reloc, _: &ExternalName, _: Addend); + fn reloc_external( + &mut self, + _: CodeOffset, + _: SourceLoc, + _: Reloc, + _: &ExternalName, + _: Addend, + ); /// Add a relocation referencing a constant. fn reloc_constant(&mut self, _: CodeOffset, _: Reloc, _: ConstantOffset); @@ -132,9 +139,15 @@ impl<'a> CodeSink for MemoryCodeSink<'a> { self.relocs.reloc_block(ofs, rel, block_offset); } - fn reloc_external(&mut self, rel: Reloc, name: &ExternalName, addend: Addend) { + fn reloc_external( + &mut self, + srcloc: SourceLoc, + rel: Reloc, + name: &ExternalName, + addend: Addend, + ) { let ofs = self.offset(); - self.relocs.reloc_external(ofs, rel, name, addend); + self.relocs.reloc_external(ofs, srcloc, rel, name, addend); } fn reloc_constant(&mut self, rel: Reloc, constant_offset: ConstantOffset) { @@ -177,10 +190,18 @@ impl<'a> CodeSink for MemoryCodeSink<'a> { pub struct NullRelocSink {} impl RelocSink for NullRelocSink { - fn reloc_block(&mut self, _: u32, _: Reloc, _: u32) {} - fn reloc_external(&mut self, _: u32, _: Reloc, _: &ExternalName, _: i64) {} + fn reloc_block(&mut self, _: CodeOffset, _: Reloc, _: CodeOffset) {} + fn reloc_external( + &mut self, + _: CodeOffset, + _: SourceLoc, + _: Reloc, + _: &ExternalName, + _: Addend, + ) { + } fn reloc_constant(&mut self, _: CodeOffset, _: Reloc, _: ConstantOffset) {} - fn reloc_jt(&mut self, _: u32, _: Reloc, _: JumpTable) {} + fn reloc_jt(&mut self, _: CodeOffset, _: Reloc, _: JumpTable) {} } /// A `TrapSink` implementation that does nothing, which is convenient when diff --git a/cranelift/codegen/src/binemit/mod.rs b/cranelift/codegen/src/binemit/mod.rs index 347e3bbadd..872f33ab28 100644 --- a/cranelift/codegen/src/binemit/mod.rs +++ b/cranelift/codegen/src/binemit/mod.rs @@ -140,7 +140,7 @@ pub trait CodeSink { fn reloc_block(&mut self, _: Reloc, _: CodeOffset); /// Add a relocation referencing an external symbol plus the addend at the current offset. - fn reloc_external(&mut self, _: Reloc, _: &ExternalName, _: Addend); + fn reloc_external(&mut self, _: SourceLoc, _: Reloc, _: &ExternalName, _: Addend); /// Add a relocation referencing a constant. fn reloc_constant(&mut self, _: Reloc, _: ConstantOffset); diff --git a/cranelift/faerie/src/backend.rs b/cranelift/faerie/src/backend.rs index 91ffc265e4..4ae4ecc21c 100644 --- a/cranelift/faerie/src/backend.rs +++ b/cranelift/faerie/src/backend.rs @@ -386,6 +386,7 @@ impl<'a> RelocSink for FaerieRelocSink<'a> { fn reloc_external( &mut self, offset: CodeOffset, + _srcloc: ir::SourceLoc, reloc: Reloc, name: &ir::ExternalName, addend: Addend, diff --git a/cranelift/filetests/src/test_binemit.rs b/cranelift/filetests/src/test_binemit.rs index d2cfdd97ca..198a2c604b 100644 --- a/cranelift/filetests/src/test_binemit.rs +++ b/cranelift/filetests/src/test_binemit.rs @@ -79,6 +79,7 @@ impl binemit::CodeSink for TextSink { fn reloc_external( &mut self, + _srcloc: ir::SourceLoc, reloc: binemit::Reloc, name: &ir::ExternalName, addend: binemit::Addend, diff --git a/cranelift/filetests/src/test_compile.rs b/cranelift/filetests/src/test_compile.rs index 0ac8c48c5e..8e0f2dd1ab 100644 --- a/cranelift/filetests/src/test_compile.rs +++ b/cranelift/filetests/src/test_compile.rs @@ -101,6 +101,7 @@ impl binemit::CodeSink for SizeSink { fn reloc_block(&mut self, _reloc: binemit::Reloc, _block_offset: binemit::CodeOffset) {} fn reloc_external( &mut self, + _srcloc: ir::SourceLoc, _reloc: binemit::Reloc, _name: &ir::ExternalName, _addend: binemit::Addend, diff --git a/cranelift/filetests/src/test_rodata.rs b/cranelift/filetests/src/test_rodata.rs index 3dabc86e00..7761e504f1 100644 --- a/cranelift/filetests/src/test_rodata.rs +++ b/cranelift/filetests/src/test_rodata.rs @@ -109,7 +109,14 @@ impl binemit::CodeSink for RodataSink { } fn reloc_block(&mut self, _reloc: binemit::Reloc, _block_offset: binemit::CodeOffset) {} - fn reloc_external(&mut self, _: binemit::Reloc, _: &ir::ExternalName, _: binemit::Addend) {} + fn reloc_external( + &mut self, + _: ir::SourceLoc, + _: binemit::Reloc, + _: &ir::ExternalName, + _: binemit::Addend, + ) { + } fn reloc_constant(&mut self, _: binemit::Reloc, _: ir::ConstantOffset) {} fn reloc_jt(&mut self, _reloc: binemit::Reloc, _jt: ir::JumpTable) {} fn trap(&mut self, _code: ir::TrapCode, _srcloc: ir::SourceLoc) {} diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index d4b899a460..664dd34ab2 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -530,6 +530,7 @@ impl RelocSink for ObjectRelocSink { fn reloc_external( &mut self, offset: CodeOffset, + _srcloc: ir::SourceLoc, reloc: Reloc, name: &ir::ExternalName, mut addend: Addend, diff --git a/cranelift/simplejit/src/backend.rs b/cranelift/simplejit/src/backend.rs index a5d0150904..c69cf11b49 100644 --- a/cranelift/simplejit/src/backend.rs +++ b/cranelift/simplejit/src/backend.rs @@ -631,6 +631,7 @@ impl RelocSink for SimpleJITRelocSink { fn reloc_external( &mut self, offset: CodeOffset, + _srcloc: ir::SourceLoc, reloc: Reloc, name: &ir::ExternalName, addend: Addend, diff --git a/cranelift/src/disasm.rs b/cranelift/src/disasm.rs index ba80e3d57f..0b60439f4d 100644 --- a/cranelift/src/disasm.rs +++ b/cranelift/src/disasm.rs @@ -37,6 +37,7 @@ impl binemit::RelocSink for PrintRelocs { fn reloc_external( &mut self, where_: binemit::CodeOffset, + _srcloc: ir::SourceLoc, r: binemit::Reloc, name: &ir::ExternalName, addend: binemit::Addend, diff --git a/crates/environ/src/cranelift.rs b/crates/environ/src/cranelift.rs index 5764ce1419..4e8f65b8e0 100644 --- a/crates/environ/src/cranelift.rs +++ b/crates/environ/src/cranelift.rs @@ -41,6 +41,7 @@ impl binemit::RelocSink for RelocSink { fn reloc_external( &mut self, offset: binemit::CodeOffset, + _srcloc: ir::SourceLoc, reloc: binemit::Reloc, name: &ExternalName, addend: binemit::Addend, diff --git a/crates/jit/src/compiler.rs b/crates/jit/src/compiler.rs index 5bf2fd95ff..edcc988311 100644 --- a/crates/jit/src/compiler.rs +++ b/crates/jit/src/compiler.rs @@ -434,6 +434,7 @@ impl binemit::RelocSink for RelocSink { fn reloc_external( &mut self, offset: binemit::CodeOffset, + _srcloc: ir::SourceLoc, reloc: binemit::Reloc, name: &ir::ExternalName, addend: binemit::Addend, diff --git a/crates/jit/src/trampoline.rs b/crates/jit/src/trampoline.rs index 8d32cd714d..7ece3e51dc 100644 --- a/crates/jit/src/trampoline.rs +++ b/crates/jit/src/trampoline.rs @@ -31,6 +31,7 @@ pub mod binemit { fn reloc_external( &mut self, _offset: binemit::CodeOffset, + _srcloc: ir::SourceLoc, _reloc: binemit::Reloc, _name: &ir::ExternalName, _addend: binemit::Addend, diff --git a/crates/lightbeam/src/backend.rs b/crates/lightbeam/src/backend.rs index 4b8f36215c..48a3d28da9 100644 --- a/crates/lightbeam/src/backend.rs +++ b/crates/lightbeam/src/backend.rs @@ -5404,6 +5404,8 @@ impl<'this, M: ModuleContext> Context<'this, M> { .unwrap() .0) as u32 + 2, + // Passing a default location here, since until proven otherwise, it's not used. + ir::SourceLoc::default(), binemit::Reloc::Abs8, name, 0, diff --git a/crates/lightbeam/src/translate_sections.rs b/crates/lightbeam/src/translate_sections.rs index aaae78ba64..898980614e 100644 --- a/crates/lightbeam/src/translate_sections.rs +++ b/crates/lightbeam/src/translate_sections.rs @@ -87,6 +87,7 @@ impl binemit::RelocSink for UnimplementedRelocSink { fn reloc_external( &mut self, _: binemit::CodeOffset, + _: ir::SourceLoc, _: binemit::Reloc, _: &ir::ExternalName, _: binemit::Addend,