@@ -471,6 +471,10 @@ pub enum Inst {
471471 /// reports its own `def`s/`use`s/`mod`s; this adds complexity (the instruction list is no
472472 /// longer flat) and requires knowledge about semantics and initial-value independence anyway.
473473 XmmUninitializedValue { dst : Writable < Reg > } ,
474+
475+ /// A call to the `ElfTlsGetAddr` libcall. Returns address
476+ /// of TLS symbol in rax.
477+ ElfTlsGetAddr { symbol : ExternalName } ,
474478}
475479
476480pub ( crate ) fn low32_will_sign_extend_to_64 ( x : u64 ) -> bool {
@@ -529,7 +533,8 @@ impl Inst {
529533 | Inst :: XmmCmpRmR { .. }
530534 | Inst :: XmmLoadConst { .. }
531535 | Inst :: XmmMinMaxSeq { .. }
532- | Inst :: XmmUninitializedValue { .. } => None ,
536+ | Inst :: XmmUninitializedValue { .. }
537+ | Inst :: ElfTlsGetAddr { .. } => None ,
533538
534539 // These use dynamic SSE opcodes.
535540 Inst :: GprToXmm { op, .. }
@@ -1759,6 +1764,10 @@ impl PrettyPrint for Inst {
17591764 Inst :: Hlt => "hlt" . into ( ) ,
17601765
17611766 Inst :: Ud2 { trap_code } => format ! ( "ud2 {}" , trap_code) ,
1767+
1768+ Inst :: ElfTlsGetAddr { ref symbol } => {
1769+ format ! ( "elf_tls_get_addr {:?}" , symbol)
1770+ }
17621771 }
17631772 }
17641773}
@@ -2018,6 +2027,36 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
20182027 | Inst :: Fence { .. } => {
20192028 // No registers are used.
20202029 }
2030+
2031+ Inst :: ElfTlsGetAddr { .. } => {
2032+ // All caller-saves are clobbered.
2033+ collector. add_def ( Writable :: from_reg ( regs:: rsi ( ) ) ) ;
2034+ collector. add_def ( Writable :: from_reg ( regs:: rdi ( ) ) ) ;
2035+ collector. add_def ( Writable :: from_reg ( regs:: rax ( ) ) ) ;
2036+ collector. add_def ( Writable :: from_reg ( regs:: rcx ( ) ) ) ;
2037+ collector. add_def ( Writable :: from_reg ( regs:: rdx ( ) ) ) ;
2038+ collector. add_def ( Writable :: from_reg ( regs:: r8 ( ) ) ) ;
2039+ collector. add_def ( Writable :: from_reg ( regs:: r9 ( ) ) ) ;
2040+ collector. add_def ( Writable :: from_reg ( regs:: r10 ( ) ) ) ;
2041+ collector. add_def ( Writable :: from_reg ( regs:: r11 ( ) ) ) ;
2042+
2043+ collector. add_def ( Writable :: from_reg ( regs:: xmm0 ( ) ) ) ;
2044+ collector. add_def ( Writable :: from_reg ( regs:: xmm1 ( ) ) ) ;
2045+ collector. add_def ( Writable :: from_reg ( regs:: xmm2 ( ) ) ) ;
2046+ collector. add_def ( Writable :: from_reg ( regs:: xmm3 ( ) ) ) ;
2047+ collector. add_def ( Writable :: from_reg ( regs:: xmm4 ( ) ) ) ;
2048+ collector. add_def ( Writable :: from_reg ( regs:: xmm5 ( ) ) ) ;
2049+ collector. add_def ( Writable :: from_reg ( regs:: xmm6 ( ) ) ) ;
2050+ collector. add_def ( Writable :: from_reg ( regs:: xmm7 ( ) ) ) ;
2051+ collector. add_def ( Writable :: from_reg ( regs:: xmm8 ( ) ) ) ;
2052+ collector. add_def ( Writable :: from_reg ( regs:: xmm9 ( ) ) ) ;
2053+ collector. add_def ( Writable :: from_reg ( regs:: xmm10 ( ) ) ) ;
2054+ collector. add_def ( Writable :: from_reg ( regs:: xmm11 ( ) ) ) ;
2055+ collector. add_def ( Writable :: from_reg ( regs:: xmm12 ( ) ) ) ;
2056+ collector. add_def ( Writable :: from_reg ( regs:: xmm13 ( ) ) ) ;
2057+ collector. add_def ( Writable :: from_reg ( regs:: xmm14 ( ) ) ) ;
2058+ collector. add_def ( Writable :: from_reg ( regs:: xmm15 ( ) ) ) ;
2059+ }
20212060 }
20222061}
20232062
@@ -2393,6 +2432,7 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
23932432 | Inst :: Ud2 { .. }
23942433 | Inst :: Hlt
23952434 | Inst :: AtomicRmwSeq { .. }
2435+ | Inst :: ElfTlsGetAddr { .. }
23962436 | Inst :: Fence { .. } => {
23972437 // Instruction doesn't explicitly mention any regs, so it can't have any virtual
23982438 // regs that we'd need to remap. Hence no action required.
0 commit comments