Skip to content

Commit 6f6c6c5

Browse files
committed
cmd/internal/obj: rip out argp adjustment for wrapper frames
The previous CL made this adjustment unnecessary. The argp field is no longer used by the runtime. Change-Id: I3491eeef4103c6653ec345d604c0acd290af9e8f Reviewed-on: https://go-review.googlesource.com/c/go/+/685356 Reviewed-by: Michael Knyszek <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Cuong Manh Le <[email protected]>
1 parent 7b50024 commit 6f6c6c5

File tree

11 files changed

+8
-842
lines changed

11 files changed

+8
-842
lines changed

src/cmd/internal/obj/arm/obj5.go

Lines changed: 0 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -350,117 +350,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
350350
p.To.Reg = REGSP
351351
p.Spadj = autosize
352352

353-
if cursym.Func().Text.From.Sym.Wrapper() {
354-
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
355-
//
356-
// MOVW g_panic(g), R1
357-
// CMP $0, R1
358-
// B.NE checkargp
359-
// end:
360-
// NOP
361-
// ... function ...
362-
// checkargp:
363-
// MOVW panic_argp(R1), R2
364-
// ADD $(autosize+4), R13, R3
365-
// CMP R2, R3
366-
// B.NE end
367-
// ADD $4, R13, R4
368-
// MOVW R4, panic_argp(R1)
369-
// B end
370-
//
371-
// The NOP is needed to give the jumps somewhere to land.
372-
// It is a liblink NOP, not an ARM NOP: it encodes to 0 instruction bytes.
373-
374-
p = obj.Appendp(p, newprog)
375-
p.As = AMOVW
376-
p.From.Type = obj.TYPE_MEM
377-
p.From.Reg = REGG
378-
p.From.Offset = 4 * int64(ctxt.Arch.PtrSize) // G.panic
379-
p.To.Type = obj.TYPE_REG
380-
p.To.Reg = REG_R1
381-
382-
p = obj.Appendp(p, newprog)
383-
p.As = ACMP
384-
p.From.Type = obj.TYPE_CONST
385-
p.From.Offset = 0
386-
p.Reg = REG_R1
387-
388-
// B.NE checkargp
389-
bne := obj.Appendp(p, newprog)
390-
bne.As = ABNE
391-
bne.To.Type = obj.TYPE_BRANCH
392-
393-
// end: NOP
394-
end := obj.Appendp(bne, newprog)
395-
end.As = obj.ANOP
396-
397-
// find end of function
398-
var last *obj.Prog
399-
for last = end; last.Link != nil; last = last.Link {
400-
}
401-
402-
// MOVW panic_argp(R1), R2
403-
mov := obj.Appendp(last, newprog)
404-
mov.As = AMOVW
405-
mov.From.Type = obj.TYPE_MEM
406-
mov.From.Reg = REG_R1
407-
mov.From.Offset = 0 // Panic.argp
408-
mov.To.Type = obj.TYPE_REG
409-
mov.To.Reg = REG_R2
410-
411-
// B.NE branch target is MOVW above
412-
bne.To.SetTarget(mov)
413-
414-
// ADD $(autosize+4), R13, R3
415-
p = obj.Appendp(mov, newprog)
416-
p.As = AADD
417-
p.From.Type = obj.TYPE_CONST
418-
p.From.Offset = int64(autosize) + 4
419-
p.Reg = REG_R13
420-
p.To.Type = obj.TYPE_REG
421-
p.To.Reg = REG_R3
422-
423-
// CMP R2, R3
424-
p = obj.Appendp(p, newprog)
425-
p.As = ACMP
426-
p.From.Type = obj.TYPE_REG
427-
p.From.Reg = REG_R2
428-
p.Reg = REG_R3
429-
430-
// B.NE end
431-
p = obj.Appendp(p, newprog)
432-
p.As = ABNE
433-
p.To.Type = obj.TYPE_BRANCH
434-
p.To.SetTarget(end)
435-
436-
// ADD $4, R13, R4
437-
p = obj.Appendp(p, newprog)
438-
p.As = AADD
439-
p.From.Type = obj.TYPE_CONST
440-
p.From.Offset = 4
441-
p.Reg = REG_R13
442-
p.To.Type = obj.TYPE_REG
443-
p.To.Reg = REG_R4
444-
445-
// MOVW R4, panic_argp(R1)
446-
p = obj.Appendp(p, newprog)
447-
p.As = AMOVW
448-
p.From.Type = obj.TYPE_REG
449-
p.From.Reg = REG_R4
450-
p.To.Type = obj.TYPE_MEM
451-
p.To.Reg = REG_R1
452-
p.To.Offset = 0 // Panic.argp
453-
454-
// B end
455-
p = obj.Appendp(p, newprog)
456-
p.As = AB
457-
p.To.Type = obj.TYPE_BRANCH
458-
p.To.SetTarget(end)
459-
460-
// reset for subsequent passes
461-
p = end
462-
}
463-
464353
case obj.ARET:
465354
nocache(p)
466355
if cursym.Func().Text.Mark&LEAF != 0 {

src/cmd/internal/obj/arm64/obj7.go

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -733,111 +733,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
733733
q1.To.Type = obj.TYPE_REG
734734
q1.To.Reg = REGFP
735735

736-
if c.cursym.Func().Text.From.Sym.Wrapper() {
737-
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
738-
//
739-
// MOV g_panic(g), RT1
740-
// CBNZ checkargp
741-
// end:
742-
// NOP
743-
// ... function body ...
744-
// checkargp:
745-
// MOV panic_argp(RT1), RT2
746-
// ADD $(autosize+8), RSP, R20
747-
// CMP RT2, R20
748-
// BNE end
749-
// ADD $8, RSP, R20
750-
// MOVD R20, panic_argp(RT1)
751-
// B end
752-
//
753-
// The NOP is needed to give the jumps somewhere to land.
754-
// It is a liblink NOP, not an ARM64 NOP: it encodes to 0 instruction bytes.
755-
q = q1
756-
757-
// MOV g_panic(g), RT1
758-
q = obj.Appendp(q, c.newprog)
759-
q.As = AMOVD
760-
q.From.Type = obj.TYPE_MEM
761-
q.From.Reg = REGG
762-
q.From.Offset = 4 * int64(c.ctxt.Arch.PtrSize) // G.panic
763-
q.To.Type = obj.TYPE_REG
764-
q.To.Reg = REGRT1
765-
766-
// CBNZ RT1, checkargp
767-
cbnz := obj.Appendp(q, c.newprog)
768-
cbnz.As = ACBNZ
769-
cbnz.From.Type = obj.TYPE_REG
770-
cbnz.From.Reg = REGRT1
771-
cbnz.To.Type = obj.TYPE_BRANCH
772-
773-
// Empty branch target at the top of the function body
774-
end := obj.Appendp(cbnz, c.newprog)
775-
end.As = obj.ANOP
776-
777-
// find the end of the function
778-
var last *obj.Prog
779-
for last = end; last.Link != nil; last = last.Link {
780-
}
781-
782-
// MOV panic_argp(RT1), RT2
783-
mov := obj.Appendp(last, c.newprog)
784-
mov.As = AMOVD
785-
mov.From.Type = obj.TYPE_MEM
786-
mov.From.Reg = REGRT1
787-
mov.From.Offset = 0 // Panic.argp
788-
mov.To.Type = obj.TYPE_REG
789-
mov.To.Reg = REGRT2
790-
791-
// CBNZ branches to the MOV above
792-
cbnz.To.SetTarget(mov)
793-
794-
// ADD $(autosize+8), SP, R20
795-
q = obj.Appendp(mov, c.newprog)
796-
q.As = AADD
797-
q.From.Type = obj.TYPE_CONST
798-
q.From.Offset = int64(c.autosize) + 8
799-
q.Reg = REGSP
800-
q.To.Type = obj.TYPE_REG
801-
q.To.Reg = REG_R20
802-
803-
// CMP RT2, R20
804-
q = obj.Appendp(q, c.newprog)
805-
q.As = ACMP
806-
q.From.Type = obj.TYPE_REG
807-
q.From.Reg = REGRT2
808-
q.Reg = REG_R20
809-
810-
// BNE end
811-
q = obj.Appendp(q, c.newprog)
812-
q.As = ABNE
813-
q.To.Type = obj.TYPE_BRANCH
814-
q.To.SetTarget(end)
815-
816-
// ADD $8, SP, R20
817-
q = obj.Appendp(q, c.newprog)
818-
q.As = AADD
819-
q.From.Type = obj.TYPE_CONST
820-
q.From.Offset = 8
821-
q.Reg = REGSP
822-
q.To.Type = obj.TYPE_REG
823-
q.To.Reg = REG_R20
824-
825-
// MOV R20, panic_argp(RT1)
826-
q = obj.Appendp(q, c.newprog)
827-
q.As = AMOVD
828-
q.From.Type = obj.TYPE_REG
829-
q.From.Reg = REG_R20
830-
q.To.Type = obj.TYPE_MEM
831-
q.To.Reg = REGRT1
832-
q.To.Offset = 0 // Panic.argp
833-
834-
// B end
835-
q = obj.Appendp(q, c.newprog)
836-
q.As = AB
837-
q.To.Type = obj.TYPE_BRANCH
838-
q.To.SetTarget(end)
839-
}
840-
841736
case obj.ARET:
842737
nocache(p)
843738
if p.From.Type == obj.TYPE_CONST {

src/cmd/internal/obj/loong64/obj.go

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
301301
var q *obj.Prog
302302
var q1 *obj.Prog
303303
autosize := int32(0)
304-
var p1 *obj.Prog
305-
var p2 *obj.Prog
306304
for p := c.cursym.Func().Text; p != nil; p = p.Link {
307305
o := p.As
308306
switch o {
@@ -401,90 +399,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
401399
q.To.Reg = REGSP
402400
}
403401

404-
if c.cursym.Func().Text.From.Sym.Wrapper() && c.cursym.Func().Text.Mark&LEAF == 0 {
405-
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
406-
//
407-
// MOV g_panic(g), R20
408-
// BEQ R20, end
409-
// MOV panic_argp(R20), R24
410-
// ADD $(autosize+FIXED_FRAME), R3, R30
411-
// BNE R24, R30, end
412-
// ADD $FIXED_FRAME, R3, R24
413-
// MOV R24, panic_argp(R20)
414-
// end:
415-
// NOP
416-
//
417-
// The NOP is needed to give the jumps somewhere to land.
418-
// It is a liblink NOP, not a hardware NOP: it encodes to 0 instruction bytes.
419-
//
420-
// We don't generate this for leaves because that means the wrapped
421-
// function was inlined into the wrapper.
422-
423-
q = obj.Appendp(q, newprog)
424-
425-
q.As = mov
426-
q.From.Type = obj.TYPE_MEM
427-
q.From.Reg = REGG
428-
q.From.Offset = 4 * int64(c.ctxt.Arch.PtrSize) // G.panic
429-
q.To.Type = obj.TYPE_REG
430-
q.To.Reg = REG_R20
431-
432-
q = obj.Appendp(q, newprog)
433-
q.As = ABEQ
434-
q.From.Type = obj.TYPE_REG
435-
q.From.Reg = REG_R20
436-
q.To.Type = obj.TYPE_BRANCH
437-
q.Mark |= BRANCH
438-
p1 = q
439-
440-
q = obj.Appendp(q, newprog)
441-
q.As = mov
442-
q.From.Type = obj.TYPE_MEM
443-
q.From.Reg = REG_R20
444-
q.From.Offset = 0 // Panic.argp
445-
q.To.Type = obj.TYPE_REG
446-
q.To.Reg = REG_R24
447-
448-
q = obj.Appendp(q, newprog)
449-
q.As = add
450-
q.From.Type = obj.TYPE_CONST
451-
q.From.Offset = int64(autosize) + ctxt.Arch.FixedFrameSize
452-
q.Reg = REGSP
453-
q.To.Type = obj.TYPE_REG
454-
q.To.Reg = REG_R30
455-
456-
q = obj.Appendp(q, newprog)
457-
q.As = ABNE
458-
q.From.Type = obj.TYPE_REG
459-
q.From.Reg = REG_R24
460-
q.Reg = REG_R30
461-
q.To.Type = obj.TYPE_BRANCH
462-
q.Mark |= BRANCH
463-
p2 = q
464-
465-
q = obj.Appendp(q, newprog)
466-
q.As = add
467-
q.From.Type = obj.TYPE_CONST
468-
q.From.Offset = ctxt.Arch.FixedFrameSize
469-
q.Reg = REGSP
470-
q.To.Type = obj.TYPE_REG
471-
q.To.Reg = REG_R24
472-
473-
q = obj.Appendp(q, newprog)
474-
q.As = mov
475-
q.From.Type = obj.TYPE_REG
476-
q.From.Reg = REG_R24
477-
q.To.Type = obj.TYPE_MEM
478-
q.To.Reg = REG_R20
479-
q.To.Offset = 0 // Panic.argp
480-
481-
q = obj.Appendp(q, newprog)
482-
483-
q.As = obj.ANOP
484-
p1.To.SetTarget(q)
485-
p2.To.SetTarget(q)
486-
}
487-
488402
case ARET:
489403
if p.From.Type == obj.TYPE_CONST {
490404
ctxt.Diag("using BECOME (%v) is not supported!", p)

0 commit comments

Comments
 (0)