Add TLS support for ELF and MachO (#1174)
* Add TLS support * Add binemit and legalize tests * Spill all caller-saved registers when necessary
This commit is contained in:
@@ -4,7 +4,10 @@ use super::enc_tables::{needs_offset, needs_sib_byte};
|
||||
use super::registers::RU;
|
||||
use crate::binemit::{bad_encoding, CodeSink, Reloc};
|
||||
use crate::ir::condcodes::{CondCode, FloatCC, IntCC};
|
||||
use crate::ir::{Block, Constant, Function, Inst, InstructionData, JumpTable, Opcode, TrapCode};
|
||||
use crate::ir::{
|
||||
Block, Constant, ExternalName, Function, Inst, InstructionData, JumpTable, LibCall, Opcode,
|
||||
TrapCode,
|
||||
};
|
||||
use crate::isa::{RegUnit, StackBase, StackBaseMask, StackRef, TargetIsa};
|
||||
use crate::regalloc::RegDiversions;
|
||||
|
||||
|
||||
@@ -1288,3 +1288,40 @@ fn convert_ineg(
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
fn expand_tls_value(
|
||||
inst: ir::Inst,
|
||||
func: &mut ir::Function,
|
||||
_cfg: &mut ControlFlowGraph,
|
||||
isa: &dyn TargetIsa,
|
||||
) {
|
||||
use crate::settings::TlsModel;
|
||||
|
||||
assert!(
|
||||
isa.triple().architecture == target_lexicon::Architecture::X86_64,
|
||||
"Not yet implemented for {:?}",
|
||||
isa.triple(),
|
||||
);
|
||||
|
||||
if let ir::InstructionData::UnaryGlobalValue {
|
||||
opcode: ir::Opcode::TlsValue,
|
||||
global_value,
|
||||
} = func.dfg[inst]
|
||||
{
|
||||
let ctrl_typevar = func.dfg.ctrl_typevar(inst);
|
||||
assert_eq!(ctrl_typevar, ir::types::I64);
|
||||
|
||||
match isa.flags().tls_model() {
|
||||
TlsModel::None => panic!("tls_model flag is not set."),
|
||||
TlsModel::ElfGd => {
|
||||
func.dfg.replace(inst).x86_elf_tls_get_addr(global_value);
|
||||
}
|
||||
TlsModel::Macho => {
|
||||
func.dfg.replace(inst).x86_macho_tls_get_addr(global_value);
|
||||
}
|
||||
model => unimplemented!("tls_value for tls model {:?}", model),
|
||||
}
|
||||
} else {
|
||||
unreachable!();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user