* Initial skeleton. * Add basic faerie support. This adds enough functionality to enable simple .o file writing through faerie. This included adding the functionality to Module to support RelocSink implementations. * Add basic SimpleJIT support. This adds enough functionality to enable a simple program to be jitted and executed. * Make declare_func_in_func take a Function instead of a Context. It only needs the Function, and sometimes it's useful to call it from places that don't have a full Context. * Temporarily disable local and exported global variables in the Faerie backend. Faerie assumes these variables use pc-relative offset instructions, and Cretonne is not yet emitting those instructions. * FaerieBackend depends on PIC. Faerie itself only supports PIC objects for now, so add an assert to Cretonne to check that it's using a PIC target flag. * SimpleJIT support for data objects. * Preliminary faerie support for data objects. * Support for data objects in faerie using the new colocated flag. * Unit tests for DataContext and friends. * Add a Module::consume() function. This consumes the Module and returns the contained Backend, so that users can call Backend-specific functions with it. For example, the Faerie backend has functions to write an object file. * Update the new crates to version 0.4.4. * Make FaerieBackend own its TargetIsa. This simplifies its interface, as it eliminates a lifetime parameter. While we may eventually want to look into allowing multiple clients to share a TargetIsa, it isn't worth the complexity for FaerieBackend right now. * Don't try to protect faerie from multiple declarations. Let faerie decide for itself whether it wants to consider two declarations to be compatible. * Use debug_assert_eq rather than debug_assert with ==. * Fix FaerieRelocSink's reloc_external to handle data object names. * Relax the asserts in get_function_definition and get_data_definition. These functions don't require definable symbols, but they do require that definable symbols be defined. This is needed for the simplejit backend. * Add a function to the faerie backend to retrieve the artifact name. * Sync up with cretonne changes.
34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
//! Utilities for working with Faerie container formats.
|
|
|
|
use cretonne_codegen::binemit::Reloc;
|
|
|
|
/// An object file format.
|
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
|
pub enum Format {
|
|
/// The ELF object file format.
|
|
ELF,
|
|
/// The Mach-O object file format.
|
|
MachO,
|
|
}
|
|
|
|
/// Translate from a Cretonne `Reloc` to a raw object-file-format-specific
|
|
/// relocation code.
|
|
pub fn raw_relocation(reloc: Reloc, format: Format) -> u32 {
|
|
match format {
|
|
Format::ELF => {
|
|
use goblin::elf;
|
|
match reloc {
|
|
Reloc::Abs4 => elf::reloc::R_X86_64_32,
|
|
Reloc::Abs8 => elf::reloc::R_X86_64_64,
|
|
Reloc::X86PCRel4 => elf::reloc::R_X86_64_PC32,
|
|
// TODO: Get Cretonne to tell us when we can use
|
|
// R_X86_64_GOTPCRELX/R_X86_64_REX_GOTPCRELX.
|
|
Reloc::X86GOTPCRel4 => elf::reloc::R_X86_64_GOTPCREL,
|
|
Reloc::X86PLTRel4 => elf::reloc::R_X86_64_PLT32,
|
|
_ => unimplemented!(),
|
|
}
|
|
}
|
|
Format::MachO => unimplemented!(),
|
|
}
|
|
}
|