authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-11-13 20:19:22+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-11-14 12:19:38+01:00
log94538d8dd2fbfb8d23c43a813838f2ab5c4a8ad8
tree5977714450d9620dd83e17ae8f92ab04b4acf371
parent9ab7eec23e6aa1fc8d5659566e426816ba573537

std.pie: add missing clobbers on alpha and sparc

Also format all the assembly code in the file.

1 files changed, 17 insertions(+), 13 deletions(-)

lib/std/pie.zig+17-13
...@@ -56,8 +56,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -56,8 +56,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
56 \\ .weak _DYNAMIC56 \\ .weak _DYNAMIC
57 \\ .hidden _DYNAMIC57 \\ .hidden _DYNAMIC
58 \\ call 1f58 \\ call 1f
59 \\ 1: pop %[ret]59 \\1:
60 \\ lea _DYNAMIC-1b(%[ret]), %[ret]60 \\ pop %[ret]
61 \\ lea _DYNAMIC - 1b(%[ret]), %[ret]
61 : [ret] "=r" (-> [*]const elf.Dyn),62 : [ret] "=r" (-> [*]const elf.Dyn),
62 ),63 ),
63 .x86_64 => asm volatile (64 .x86_64 => asm volatile (
...@@ -79,8 +80,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -79,8 +80,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
79 \\ ldr %[ret], 1f80 \\ ldr %[ret], 1f
80 \\ add %[ret], pc81 \\ add %[ret], pc
81 \\ b 2f82 \\ b 2f
82 \\ 1: .word _DYNAMIC-1b83 \\1:
83 \\ 2:84 \\ .word _DYNAMIC-1b
85 \\2:
84 : [ret] "=r" (-> [*]const elf.Dyn),86 : [ret] "=r" (-> [*]const elf.Dyn),
85 ),87 ),
86 // A simple `adr` is not enough as it has a limited offset range88 // A simple `adr` is not enough as it has a limited offset range
...@@ -99,7 +101,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -99,7 +101,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
99 \\ ldq %[ret], -0x8000($29)101 \\ ldq %[ret], -0x8000($29)
100 : [ret] "=r" (-> [*]const elf.Dyn),102 : [ret] "=r" (-> [*]const elf.Dyn),
101 :103 :
102 : .{ .r26 = true }),104 : .{ .r26 = true, .r29 = true }),
103 // The CSKY ABI requires the gb register to point to the GOT. Additionally, the first105 // The CSKY ABI requires the gb register to point to the GOT. Additionally, the first
104 // entry in the GOT is defined to hold the address of _DYNAMIC.106 // entry in the GOT is defined to hold the address of _DYNAMIC.
105 .csky => asm volatile (107 .csky => asm volatile (
...@@ -112,7 +114,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -112,7 +114,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
112 \\ .hidden _DYNAMIC114 \\ .hidden _DYNAMIC
113 \\ jump 1f115 \\ jump 1f
114 \\ .word _DYNAMIC - .116 \\ .word _DYNAMIC - .
115 \\ 1:117 \\1:
116 \\ r1 = pc118 \\ r1 = pc
117 \\ r1 = add(r1, #-4)119 \\ r1 = add(r1, #-4)
118 \\ %[ret] = memw(r1)120 \\ %[ret] = memw(r1)
...@@ -198,7 +200,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -198,7 +200,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
198 \\ .hidden _DYNAMIC200 \\ .hidden _DYNAMIC
199 \\ bl 1f201 \\ bl 1f
200 \\ .long _DYNAMIC - .202 \\ .long _DYNAMIC - .
201 \\ 1:203 \\1:
202 \\ mflr %[ret]204 \\ mflr %[ret]
203 \\ lwz 4, 0(%[ret])205 \\ lwz 4, 0(%[ret])
204 \\ add %[ret], 4, %[ret]206 \\ add %[ret], 4, %[ret]
...@@ -210,7 +212,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -210,7 +212,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
210 \\ .hidden _DYNAMIC212 \\ .hidden _DYNAMIC
211 \\ bl 1f213 \\ bl 1f
212 \\ .quad _DYNAMIC - .214 \\ .quad _DYNAMIC - .
213 \\ 1:215 \\1:
214 \\ mflr %[ret]216 \\ mflr %[ret]
215 \\ ld 4, 0(%[ret])217 \\ ld 4, 0(%[ret])
216 \\ add %[ret], 4, %[ret]218 \\ add %[ret], 4, %[ret]
...@@ -229,8 +231,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -229,8 +231,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
229 \\ larl %[ret], 1f231 \\ larl %[ret], 1f
230 \\ ag %[ret], 0(%[ret])232 \\ ag %[ret], 0(%[ret])
231 \\ jg 2f233 \\ jg 2f
232 \\ 1: .quad _DYNAMIC - .234 \\1:
233 \\ 2:235 \\ .quad _DYNAMIC - .
236 \\2:
234 : [ret] "=a" (-> [*]const elf.Dyn),237 : [ret] "=a" (-> [*]const elf.Dyn),
235 ),238 ),
236 .sh, .sheb => asm volatile (239 .sh, .sheb => asm volatile (
...@@ -252,11 +255,12 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -252,11 +255,12 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
252 .sparc, .sparc64 => asm volatile (255 .sparc, .sparc64 => asm volatile (
253 \\ sethi %%hi(_GLOBAL_OFFSET_TABLE_ - 4), %%l7256 \\ sethi %%hi(_GLOBAL_OFFSET_TABLE_ - 4), %%l7
254 \\ call 1f257 \\ call 1f
255 \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7258 \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7
256 \\ 1:259 \\1:
257 \\ add %%l7, %%o7, %[ret]260 \\ add %%l7, %%o7, %[ret]
258 : [ret] "=r" (-> [*]const elf.Dyn),261 : [ret] "=r" (-> [*]const elf.Dyn),
259 ),262 :
263 : .{ .l7 = true }),
260 else => {264 else => {
261 @compileError("PIE startup is not yet supported for this target!");265 @compileError("PIE startup is not yet supported for this target!");
262 },266 },