Remove unused SourceLoc in many Mach data structures (#4180)
* Remove unused srcloc in MachReloc * Remove unused srcloc in MachTrap * Use `into_iter` on array in bench code to suppress a warning * Remove unused srcloc in MachCallSite
This commit is contained in:
@@ -45,15 +45,8 @@ fn one_way_jmp(sink: &mut MachBuffer<Inst>, cc: CC, label: MachLabel) {
|
||||
}
|
||||
|
||||
/// Emits a relocation, attaching the current source location as well.
|
||||
fn emit_reloc(
|
||||
sink: &mut MachBuffer<Inst>,
|
||||
state: &EmitState,
|
||||
kind: Reloc,
|
||||
name: &ExternalName,
|
||||
addend: Addend,
|
||||
) {
|
||||
let srcloc = state.cur_srcloc();
|
||||
sink.add_reloc(srcloc, kind, name, addend);
|
||||
fn emit_reloc(sink: &mut MachBuffer<Inst>, kind: Reloc, name: &ExternalName, addend: Addend) {
|
||||
sink.add_reloc(kind, name, addend);
|
||||
}
|
||||
|
||||
/// The top-level emit function.
|
||||
@@ -176,7 +169,6 @@ pub(crate) fn emit(
|
||||
let amode = addr.finalize(state, sink);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0x0FAF,
|
||||
@@ -239,7 +231,6 @@ pub(crate) fn emit(
|
||||
// Here we revert to the "normal" G-E ordering.
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
opcode_m,
|
||||
@@ -293,7 +284,6 @@ pub(crate) fn emit(
|
||||
let enc_g = int_reg_enc(src2);
|
||||
emit_std_enc_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
opcode,
|
||||
@@ -338,7 +328,6 @@ pub(crate) fn emit(
|
||||
let amode = src.finalize(state, sink).with_allocs(allocs);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcode,
|
||||
@@ -411,8 +400,7 @@ pub(crate) fn emit(
|
||||
OperandSize::Size64 => (0xF7, LegacyPrefixes::None),
|
||||
};
|
||||
|
||||
let loc = state.cur_srcloc();
|
||||
sink.add_trap(loc, TrapCode::IntegerDivisionByZero);
|
||||
sink.add_trap(TrapCode::IntegerDivisionByZero);
|
||||
|
||||
let subopcode = if *signed { 7 } else { 6 };
|
||||
match divisor.clone().to_reg_mem() {
|
||||
@@ -433,7 +421,6 @@ pub(crate) fn emit(
|
||||
let amode = src.finalize(state, sink).with_allocs(allocs);
|
||||
emit_std_enc_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcode,
|
||||
@@ -479,9 +466,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr: src } => {
|
||||
let amode = src.finalize(state, sink).with_allocs(allocs);
|
||||
emit_std_enc_mem(
|
||||
sink, state, info, prefix, 0xF7, 1, subopcode, &amode, rex_flags, 0,
|
||||
);
|
||||
emit_std_enc_mem(sink, info, prefix, 0xF7, 1, subopcode, &amode, rex_flags, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -748,7 +733,6 @@ pub(crate) fn emit(
|
||||
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
opcodes,
|
||||
@@ -768,7 +752,6 @@ pub(crate) fn emit(
|
||||
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0x8B,
|
||||
@@ -786,7 +769,6 @@ pub(crate) fn emit(
|
||||
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0x8D,
|
||||
@@ -849,7 +831,6 @@ pub(crate) fn emit(
|
||||
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
opcodes,
|
||||
@@ -886,7 +867,7 @@ pub(crate) fn emit(
|
||||
// 16-bit: MOV r16, r/m16 is 66 (REX.W==0) 89 /r
|
||||
// 32-bit: MOV r32, r/m32 is (REX.W==0) 89 /r
|
||||
// 64-bit: MOV r64, r/m64 is (REX.W==1) 89 /r
|
||||
emit_std_reg_mem(sink, state, info, prefix, opcode, 1, src, dst, rex, 0);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, 1, src, dst, rex, 0);
|
||||
}
|
||||
|
||||
Inst::ShiftR {
|
||||
@@ -996,18 +977,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMemImm::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink).with_allocs(allocs);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcode_bytes,
|
||||
2,
|
||||
dst,
|
||||
addr,
|
||||
rex,
|
||||
0,
|
||||
);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode_bytes, 2, dst, addr, rex, 0);
|
||||
}
|
||||
RegMemImm::Imm { .. } => unreachable!(),
|
||||
}
|
||||
@@ -1062,7 +1032,7 @@ pub(crate) fn emit(
|
||||
(OperandSize::Size8, false) => 0x84,
|
||||
(_, false) => 0x85,
|
||||
};
|
||||
emit_std_reg_mem(sink, state, info, prefix, opcode, 1, reg_g, addr, rex, 0);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, 1, reg_g, addr, rex, 0);
|
||||
}
|
||||
|
||||
RegMemImm::Imm { simm32 } => {
|
||||
@@ -1136,9 +1106,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink).with_allocs(allocs);
|
||||
emit_std_reg_mem(
|
||||
sink, state, info, prefix, opcode, 2, dst, addr, rex_flags, 0,
|
||||
);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, 2, dst, addr, rex_flags, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1177,7 +1145,7 @@ pub(crate) fn emit(
|
||||
let src = src.clone().to_reg_mem_imm().with_allocs(allocs);
|
||||
|
||||
if info.flags.enable_probestack() {
|
||||
sink.add_trap(state.cur_srcloc(), TrapCode::StackOverflow);
|
||||
sink.add_trap(TrapCode::StackOverflow);
|
||||
}
|
||||
|
||||
match src {
|
||||
@@ -1194,7 +1162,6 @@ pub(crate) fn emit(
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_enc_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0xFF,
|
||||
@@ -1230,7 +1197,7 @@ pub(crate) fn emit(
|
||||
|
||||
Inst::CallKnown { dest, opcode, .. } => {
|
||||
if info.flags.enable_probestack() {
|
||||
sink.add_trap(state.cur_srcloc(), TrapCode::StackOverflow);
|
||||
sink.add_trap(TrapCode::StackOverflow);
|
||||
}
|
||||
if let Some(s) = state.take_stack_map() {
|
||||
sink.add_stack_map(StackMapExtent::UpcomingBytes(5), s);
|
||||
@@ -1238,11 +1205,10 @@ pub(crate) fn emit(
|
||||
sink.put1(0xE8);
|
||||
// The addend adjusts for the difference between the end of the instruction and the
|
||||
// beginning of the immediate field.
|
||||
emit_reloc(sink, state, Reloc::X86CallPCRel4, &dest, -4);
|
||||
emit_reloc(sink, Reloc::X86CallPCRel4, &dest, -4);
|
||||
sink.put4(0);
|
||||
if opcode.is_call() {
|
||||
let loc = state.cur_srcloc();
|
||||
sink.add_call_site(loc, *opcode);
|
||||
sink.add_call_site(*opcode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1250,7 +1216,7 @@ pub(crate) fn emit(
|
||||
let dest = dest.with_allocs(allocs);
|
||||
|
||||
if info.flags.enable_probestack() {
|
||||
sink.add_trap(state.cur_srcloc(), TrapCode::StackOverflow);
|
||||
sink.add_trap(TrapCode::StackOverflow);
|
||||
}
|
||||
let start_offset = sink.cur_offset();
|
||||
match dest {
|
||||
@@ -1271,7 +1237,6 @@ pub(crate) fn emit(
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_enc_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0xFF,
|
||||
@@ -1287,8 +1252,7 @@ pub(crate) fn emit(
|
||||
sink.add_stack_map(StackMapExtent::StartedAtOffset(start_offset), s);
|
||||
}
|
||||
if opcode.is_call() {
|
||||
let loc = state.cur_srcloc();
|
||||
sink.add_call_site(loc, *opcode);
|
||||
sink.add_call_site(*opcode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1373,7 +1337,6 @@ pub(crate) fn emit(
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_enc_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
LegacyPrefixes::None,
|
||||
0xFF,
|
||||
@@ -1548,18 +1511,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcode,
|
||||
num_opcodes,
|
||||
reg_g,
|
||||
addr,
|
||||
rex,
|
||||
0,
|
||||
);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, num_opcodes, reg_g, addr, rex, 0);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1717,9 +1669,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_reg_mem(
|
||||
sink, state, info, prefix, opcode, length, reg_g, addr, rex, 0,
|
||||
);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, length, reg_g, addr, rex, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1916,7 +1866,7 @@ pub(crate) fn emit(
|
||||
"No existing way to encode a mem argument in the ModRM r/m field."
|
||||
);
|
||||
// N.B.: bytes_at_end == 1, because of the `imm` byte below.
|
||||
emit_std_reg_mem(sink, state, info, prefix, opcode, len, dst, addr, rex, 1);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, len, dst, addr, rex, 1);
|
||||
}
|
||||
}
|
||||
sink.put1(*imm);
|
||||
@@ -1951,7 +1901,6 @@ pub(crate) fn emit(
|
||||
let dst = &dst.finalize(state, sink);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcode,
|
||||
@@ -2013,7 +1962,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_reg_mem(sink, state, info, prefix, opcode, 2, reg_g, addr, rex, 0);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, 2, reg_g, addr, rex, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2036,7 +1985,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
RegMem::Mem { addr } => {
|
||||
let addr = &addr.finalize(state, sink);
|
||||
emit_std_reg_mem(sink, state, info, prefix, opcode, len, dst, addr, rex, 0);
|
||||
emit_std_reg_mem(sink, info, prefix, opcode, len, dst, addr, rex, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2585,7 +2534,7 @@ pub(crate) fn emit(
|
||||
sink.put1(0x48 | ((enc_dst >> 3) & 1) << 2);
|
||||
sink.put1(0x8B);
|
||||
sink.put1(0x05 | ((enc_dst & 7) << 3));
|
||||
emit_reloc(sink, state, Reloc::X86GOTPCRel4, name, -4);
|
||||
emit_reloc(sink, Reloc::X86GOTPCRel4, name, -4);
|
||||
sink.put4(0);
|
||||
// Offset in the relocation above applies to the address of the *GOT entry*, not
|
||||
// the loaded address; so we emit a separate add or sub instruction if needed.
|
||||
@@ -2608,7 +2557,7 @@ pub(crate) fn emit(
|
||||
let enc_dst = int_reg_enc(dst);
|
||||
sink.put1(0x48 | ((enc_dst >> 3) & 1));
|
||||
sink.put1(0xB8 | (enc_dst & 7));
|
||||
emit_reloc(sink, state, Reloc::Abs8, name, *offset);
|
||||
emit_reloc(sink, Reloc::Abs8, name, *offset);
|
||||
if info.flags.emit_all_ones_funcaddrs() {
|
||||
sink.put8(u64::max_value());
|
||||
} else {
|
||||
@@ -2643,18 +2592,7 @@ pub(crate) fn emit(
|
||||
};
|
||||
let rex = RexFlags::from((OperandSize::from_ty(*ty), replacement));
|
||||
let amode = mem.finalize(state, sink);
|
||||
emit_std_reg_mem(
|
||||
sink,
|
||||
state,
|
||||
info,
|
||||
prefix,
|
||||
opcodes,
|
||||
2,
|
||||
replacement,
|
||||
&amode,
|
||||
rex,
|
||||
0,
|
||||
);
|
||||
emit_std_reg_mem(sink, info, prefix, opcodes, 2, replacement, &amode, rex, 0);
|
||||
}
|
||||
|
||||
Inst::AtomicRmwSeq {
|
||||
@@ -2794,8 +2732,7 @@ pub(crate) fn emit(
|
||||
}
|
||||
|
||||
Inst::Ud2 { trap_code } => {
|
||||
let cur_srcloc = state.cur_srcloc();
|
||||
sink.add_trap(cur_srcloc, *trap_code);
|
||||
sink.add_trap(*trap_code);
|
||||
if let Some(s) = state.take_stack_map() {
|
||||
sink.add_stack_map(StackMapExtent::UpcomingBytes(2), s);
|
||||
}
|
||||
@@ -2908,7 +2845,7 @@ pub(crate) fn emit(
|
||||
sink.put1(0b01001000); // REX.W
|
||||
sink.put1(0x8d); // LEA
|
||||
sink.put1(0x3d); // ModRM byte
|
||||
emit_reloc(sink, state, Reloc::ElfX86_64TlsGd, symbol, -4);
|
||||
emit_reloc(sink, Reloc::ElfX86_64TlsGd, symbol, -4);
|
||||
sink.put4(0); // offset
|
||||
|
||||
// data16 data16 callq __tls_get_addr-4
|
||||
@@ -2918,7 +2855,6 @@ pub(crate) fn emit(
|
||||
sink.put1(0xe8); // CALL
|
||||
emit_reloc(
|
||||
sink,
|
||||
state,
|
||||
Reloc::X86CallPLTRel4,
|
||||
&ExternalName::LibCall(LibCall::ElfTlsGetAddr),
|
||||
-4,
|
||||
@@ -2931,7 +2867,7 @@ pub(crate) fn emit(
|
||||
sink.put1(0x48); // REX.w
|
||||
sink.put1(0x8b); // MOV
|
||||
sink.put1(0x3d); // ModRM byte
|
||||
emit_reloc(sink, state, Reloc::MachOX86_64Tlv, symbol, -4);
|
||||
emit_reloc(sink, Reloc::MachOX86_64Tlv, symbol, -4);
|
||||
sink.put4(0); // offset
|
||||
|
||||
// callq *(%rdi)
|
||||
|
||||
Reference in New Issue
Block a user