Skip to content

Commit 215de81

Browse files
committed
cmd/compile: don't merge symbols on riscv64 when dynamic linking
Each plugin is compiled as a separate shared object, with its own symbol table. When dynamic linking plugin symbols are resolved within the plugin's scope, not globally merged to avoid conflicts. Change-Id: I9e6986085855c17fbd6c39b937cb6129d216f5e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/435015 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Joel Sing <[email protected]> Reviewed-by: Michael Pratt <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
1 parent a4fcfaa commit 215de81

File tree

2 files changed

+115
-121
lines changed

2 files changed

+115
-121
lines changed

src/cmd/compile/internal/ssa/_gen/RISCV64.rules

+23-59
Original file line numberDiff line numberDiff line change
@@ -270,65 +270,29 @@
270270

271271
// We need to fold MOVaddr into the LD/MOVDstore ops so that the live variable analysis
272272
// knows what variables are being read/written by the ops.
273-
(MOVBUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
274-
(MOVBUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
275-
(MOVBload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
276-
(MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
277-
(MOVHUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
278-
(MOVHUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
279-
(MOVHload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
280-
(MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem)
281-
(MOVWUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
282-
(MOVWUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
283-
(MOVWload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
284-
(MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem)
285-
(MOVDload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
286-
(MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
287-
288-
(MOVBstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
289-
(MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
290-
(MOVHstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
291-
(MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
292-
(MOVWstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
293-
(MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
294-
(MOVDstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) =>
295-
(MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
296-
(MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
297-
(MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
298-
(MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
299-
(MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
300-
(MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
301-
(MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
302-
(MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) =>
303-
(MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
304-
305-
(MOVBUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
306-
(MOVBUload [off1+int32(off2)] {sym} base mem)
307-
(MOVBload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
308-
(MOVBload [off1+int32(off2)] {sym} base mem)
309-
(MOVHUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
310-
(MOVHUload [off1+int32(off2)] {sym} base mem)
311-
(MOVHload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
312-
(MOVHload [off1+int32(off2)] {sym} base mem)
313-
(MOVWUload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
314-
(MOVWUload [off1+int32(off2)] {sym} base mem)
315-
(MOVWload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
316-
(MOVWload [off1+int32(off2)] {sym} base mem)
317-
(MOVDload [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
318-
(MOVDload [off1+int32(off2)] {sym} base mem)
319-
320-
(MOVBstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
321-
(MOVBstore [off1+int32(off2)] {sym} base val mem)
322-
(MOVHstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
323-
(MOVHstore [off1+int32(off2)] {sym} base val mem)
324-
(MOVWstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
325-
(MOVWstore [off1+int32(off2)] {sym} base val mem)
326-
(MOVDstore [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
327-
(MOVDstore [off1+int32(off2)] {sym} base val mem)
328-
(MOVBstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
329-
(MOVHstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
330-
(MOVWstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
331-
(MOVDstorezero [off1] {sym} (ADDI [off2] ptr) mem) && is32Bit(int64(off1)+off2) => (MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
273+
(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) &&
274+
is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) &&
275+
(base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
276+
(MOV(B|BU|H|HU|W|WU|D)load [off1+off2] {mergeSym(sym1,sym2)} base mem)
277+
278+
(MOV(B|H|W|D)store [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem) &&
279+
is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) &&
280+
(base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
281+
(MOV(B|H|W|D)store [off1+off2] {mergeSym(sym1,sym2)} base val mem)
282+
283+
(MOV(B|H|W|D)storezero [off1] {sym1} (MOVaddr [off2] {sym2} base) mem) &&
284+
canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) &&
285+
(base.Op != OpSB || !config.ctxt.Flag_dynlink) =>
286+
(MOV(B|H|W|D)storezero [off1+off2] {mergeSym(sym1,sym2)} base mem)
287+
288+
(MOV(B|BU|H|HU|W|WU|D)load [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
289+
(MOV(B|BU|H|HU|W|WU|D)load [off1+int32(off2)] {sym} base mem)
290+
291+
(MOV(B|H|W|D)store [off1] {sym} (ADDI [off2] base) val mem) && is32Bit(int64(off1)+off2) =>
292+
(MOV(B|H|W|D)store [off1+int32(off2)] {sym} base val mem)
293+
294+
(MOV(B|H|W|D)storezero [off1] {sym} (ADDI [off2] base) mem) && is32Bit(int64(off1)+off2) =>
295+
(MOV(B|H|W|D)storezero [off1+int32(off2)] {sym} base mem)
332296

333297
// Similarly, fold ADDI into MOVaddr to avoid confusing live variable analysis
334298
// with OffPtr -> ADDI.

0 commit comments

Comments
 (0)