diff --git a/.github/workflows/goallc.yml b/.github/workflows/goallc.yml index 3391988dd7de86..758cd26bbd6ffb 100644 --- a/.github/workflows/goallc.yml +++ b/.github/workflows/goallc.yml @@ -25,8 +25,8 @@ concurrency: cancel-in-progress: true env: - PINNED_LLVM_RELEASE: goallc-llvm23.1.0-20260812T002702Z - PINNED_LLVM_REVISION: d9a0149bdda5b9fb1f63bf5c8cd2dbe71d7bf523 + PINNED_LLVM_RELEASE: goallc-llvm23.1.0-20260813T171727Z + PINNED_LLVM_REVISION: 1d142acb4dab7262347b57ac341235913b210f40 jobs: llvm-payload: diff --git a/src/cmd/compile/internal/ssa/llvmdata.go b/src/cmd/compile/internal/ssa/llvmdata.go index 855b41803d0f03..955e741ff88eba 100644 --- a/src/cmd/compile/internal/ssa/llvmdata.go +++ b/src/cmd/compile/internal/ssa/llvmdata.go @@ -86,15 +86,6 @@ func attachGoObjSymbolRef(value llvm.Value, s *obj.LSym) { })) } -func setGoObjABI0SymbolNameMetadata(value llvm.Value, name string, cc llvm.CallConv) { - if cc != goABI0CallConv { - return - } - value.SetGlobalMetadata(GlobalCtxt.MDKindID(goObjSymbolNameMD), GlobalCtxt.MDNode([]llvm.Metadata{ - GlobalCtxt.MDString(name), - })) -} - // attachGoObjABISymbolRef is for LLVM-generated runtime calls that do not // carry an SSA AuxCall. Use the compiler's ABI-aware symbol table so their // builtin/non-package classification stays identical to the native writer. @@ -472,13 +463,11 @@ func llvmExternalDataRef(s *obj.LSym, data map[*obj.LSym]bool) llvm.Value { storageName := llvmFunctionStorageName(s.Name, llvmCallConv(s.ABI())) if f := CurrentModule.NamedFunction(storageName); !f.IsNil() { attachGoObjSymbolRef(f, s) - setGoObjABI0SymbolNameMetadata(f, s.Name, llvmCallConv(s.ABI())) return f } f := llvm.AddFunction(CurrentModule, storageName, llvm.FunctionType(GlobalCtxt.VoidType(), nil, false)) f.SetFunctionCallConv(llvmCallConv(s.ABI())) attachGoObjSymbolRef(f, s) - setGoObjABI0SymbolNameMetadata(f, s.Name, llvmCallConv(s.ABI())) return f } if g := CurrentModule.NamedGlobal(s.Name); !g.IsNil() { diff --git a/src/cmd/compile/internal/ssa/llvmdebug.go b/src/cmd/compile/internal/ssa/llvmdebug.go index d6f27cd396dadf..de76a44f6178d9 100644 --- a/src/cmd/compile/internal/ssa/llvmdebug.go +++ b/src/cmd/compile/internal/ssa/llvmdebug.go @@ -137,9 +137,6 @@ func llvmDebugSubprogramValue(sym *obj.LSym, sp llvm.Metadata, abstractValues ma llvm.FunctionType(GlobalCtxt.VoidType(), nil, false)) value.SetFunctionCallConv(llvmCallConv(sym.ABI())) value.SetLinkage(llvm.WeakAnyLinkage) - value.SetGlobalMetadata(GlobalCtxt.MDKindID(goObjSymbolNameMD), GlobalCtxt.MDNode([]llvm.Metadata{ - GlobalCtxt.MDString(canonicalName), - })) value.SetSubprogram(sp) b := GlobalCtxt.NewBuilder() b.SetInsertPointAtEnd(GlobalCtxt.AddBasicBlock(value, "goobj.abstract")) diff --git a/src/cmd/compile/internal/ssa/ssa2llvm.go b/src/cmd/compile/internal/ssa/ssa2llvm.go index faff606b0789ec..ff6c67c2990f46 100644 --- a/src/cmd/compile/internal/ssa/ssa2llvm.go +++ b/src/cmd/compile/internal/ssa/ssa2llvm.go @@ -10,6 +10,7 @@ import ( "cmd/internal/src" "fmt" "internal/buildcfg" + "strings" "github.com/goallc/go-llvm" ) @@ -64,6 +65,7 @@ type llvmAddressedResult struct { // the standard Go linker can call directly. const goABIInternalCallConv llvm.CallConv = 22 const goABI0CallConv llvm.CallConv = 23 +const goABI0SymbolSuffix = "" const goResultsTupleAttr = "go_results_tuple" const goGCStrategy = "goallc" const goGCLeafFunctionAttr = "gc-leaf-function" @@ -76,7 +78,6 @@ const goDeferResultMD = "goallc.defer_result" const goOpenDeferBitsMD = "goallc.open_defer_bits" const goOpenDeferSlotsMD = "goallc.open_defer_slots" const goObjMarkerRelocMD = "goobj.marker_reloc" -const goObjSymbolNameMD = "goobj.symbol.name" const goObjSymbolIndexMD = "goobj.symbol.index" const llvmFramePointerAttr = "frame-pointer" const llvmFramePointerNonLeaf = "non-leaf" @@ -241,8 +242,11 @@ func configureLLVMCall(call llvm.Value, sig llvmFuncSignature) { } func llvmFunctionStorageName(name string, cc llvm.CallConv) string { + if strings.HasSuffix(name, goABI0SymbolSuffix) { + base.Fatalf("Go symbol name %q uses reserved LLVM ABI suffix", name) + } if cc == goABI0CallConv { - return name + ".goallc.abi0" + return name + goABI0SymbolSuffix } return name } @@ -272,7 +276,6 @@ func getOrInsertLLVMFunction(name string, sig llvmFuncSignature, cc llvm.CallCon replacement.SetName(storageName) fn = replacement } - setGoObjABI0SymbolNameMetadata(fn, name, cc) configureLLVMFunction(fn, sig, cc) return fn } diff --git a/src/cmd/compile/internal/ssa/ssa2llvm_test.go b/src/cmd/compile/internal/ssa/ssa2llvm_test.go index 89c6acdf1a065e..a25aeab2f93848 100644 --- a/src/cmd/compile/internal/ssa/ssa2llvm_test.go +++ b/src/cmd/compile/internal/ssa/ssa2llvm_test.go @@ -39,6 +39,21 @@ func TestLLVMCurrentGRegister(t *testing.T) { } } +func TestLLVMFunctionStorageName(t *testing.T) { + for _, test := range []struct { + name string + cc llvm.CallConv + want string + }{ + {"runtime.morestack", goABI0CallConv, "runtime.morestack"}, + {"runtime.morestack", goABIInternalCallConv, "runtime.morestack"}, + } { + if got := llvmFunctionStorageName(test.name, test.cc); got != test.want { + t.Errorf("llvmFunctionStorageName(%q, %d) = %q, want %q", test.name, test.cc, got, test.want) + } + } +} + func TestLLVMAMD64MapPackedByteLowering(t *testing.T) { oldTypes := type2lTypes oldModule := CurrentModule diff --git a/src/cmd/internal/testdir/llvm_abi_test.go b/src/cmd/internal/testdir/llvm_abi_test.go index 0bfbf05d58484a..328a7a21846798 100644 --- a/src/cmd/internal/testdir/llvm_abi_test.go +++ b/src/cmd/internal/testdir/llvm_abi_test.go @@ -230,7 +230,7 @@ func runLLVMAArch64ABIDifferentialTest(t *testing.T, gorootTestDir string) { nativeArgsMaps: [][]int{{0}, nil}, goallcArgsMaps: [][]int{{0}, nil, nil}, nativeStackMaps: []int32{-1, 0, 1, -1}, - goallcStackMaps: []int32{-1, 1, 0, 2}, + goallcStackMaps: []int32{-1, 1, -1, 2}, }, { name: "mixedABI", args: 152, pointerBits: []int{2, 4, 18}, @@ -239,106 +239,106 @@ func runLLVMAArch64ABIDifferentialTest(t *testing.T, gorootTestDir string) { // homes in LocalsPointerMaps through locals-only alloca records. goallcArgsMaps: [][]int{{2, 4, 18}, {2}}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 1, 0}, - goallcQueryMaps: [][]int{{2}, {2}, {2}, {2}, {2, 4, 18}}, + goallcStackMaps: []int32{-1, 1, -1}, + goallcQueryMaps: [][]int{{2, 4, 18}, {2}, {2}, {2}, {2}}, }, { name: "liveScalarStackArgument", args: 136, pointerBits: []int{0}, nativeArgsMaps: [][]int{{0}, nil}, goallcArgsMaps: [][]int{{0}}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 0}, + goallcStackMaps: []int32{-1, 0, -1}, checkFullMaps: true, nativeLocals: 8, goallcLocals: 24, nativeLocalMaps: [][]int{nil, nil}, goallcLocalMaps: [][]int{nil}, nativeQueries: []int32{0, -1}, - goallcQueries: []int32{0, 0}, + goallcQueries: []int32{-1, 0}, }, { name: "livePointerSequenceStackArguments", args: 152, pointerBits: []int{0, 2}, nativeArgsMaps: [][]int{{0, 2}, nil}, goallcArgsMaps: [][]int{{0, 2}}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 0}, + goallcStackMaps: []int32{-1, 0, -1}, checkFullMaps: true, nativeLocals: 8, goallcLocals: 24, nativeLocalMaps: [][]int{nil, nil}, goallcLocalMaps: [][]int{nil}, nativeQueries: []int32{0, -1}, - goallcQueries: []int32{0, 0}, + goallcQueries: []int32{-1, 0}, }, { name: "livePointerAggregateStackArgument", args: 136, pointerBits: []int{0, 2}, nativeArgsMaps: [][]int{{0, 2}, nil}, goallcArgsMaps: [][]int{{0, 2}}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 0}, + goallcStackMaps: []int32{-1, 0, -1}, checkFullMaps: true, nativeLocals: 8, goallcLocals: 24, nativeLocalMaps: [][]int{nil, nil}, goallcLocalMaps: [][]int{nil}, nativeQueries: []int32{0, -1}, - goallcQueries: []int32{0, 0}, + goallcQueries: []int32{-1, 0}, }, { name: "growPointer", args: 16, pointerBits: []int{0}, nativeArgsMaps: [][]int{{0}, nil}, goallcArgsMaps: [][]int{{0}, nil}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 1, 0}, + goallcStackMaps: []int32{-1, 1, -1}, }, { name: "overflowResults", args: 48, pointerBits: []int{2, 3, 4, 5}, nativeArgsMaps: [][]int{{2, 3, 4, 5}, nil}, goallcArgsMaps: [][]int{{2, 3, 4, 5}, nil}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 1, 0}, + goallcStackMaps: []int32{-1, 1, -1}, }, { name: "initializedStackResult", args: 16, pointerBits: []int{1}, nativeArgsMaps: [][]int{{1}, nil}, goallcArgsMaps: [][]int{{1}, nil}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 1, 0}, + goallcStackMaps: []int32{-1, 1, -1}, }, { name: "stackAggregateResult", args: 40, pointerBits: []int{4}, nativeArgsMaps: [][]int{{4}, nil}, goallcArgsMaps: [][]int{{4}, nil}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 1, 0}, + goallcStackMaps: []int32{-1, 1, -1}, }, { name: "bothOverflow", args: 168, pointerBits: []int{2, 6, 20}, nativeArgsMaps: [][]int{{2, 6, 20}, nil}, goallcArgsMaps: [][]int{{2, 6, 20}, {2}, nil}, nativeStackMaps: []int32{-1, 0, 1, -1}, - goallcStackMaps: []int32{-1, 1, 0, 2}, + goallcStackMaps: []int32{-1, 1, -1, 2}, }, { name: "pointerAggregateBothOverflow", args: 152, pointerBits: []int{0, 2}, nativeArgsMaps: [][]int{{0, 2}, nil}, goallcArgsMaps: [][]int{{0, 2}}, nativeStackMaps: []int32{-1, 0, -1}, - goallcStackMaps: []int32{-1, 0}, + goallcStackMaps: []int32{-1, 0, -1}, checkFullMaps: true, nativeLocals: 8, goallcLocals: 136, nativeLocalMaps: [][]int{nil, nil}, goallcLocalMaps: [][]int{nil}, nativeQueries: []int32{0, -1}, - goallcQueries: []int32{0, 0}, + goallcQueries: []int32{-1, 0}, }, { name: "requireAggregate", args: 40, pointerBits: []int{4}, nativeArgsMaps: [][]int{{4}, nil}, goallcArgsMaps: [][]int{{4}, nil, nil}, nativeStackMaps: []int32{-1, 0, 1, -1}, - goallcStackMaps: []int32{-1, 1, 2, 0}, + goallcStackMaps: []int32{-1, 1, 2, -1, 2}, }, } for _, tc := range cases { @@ -438,24 +438,26 @@ func runLLVMAMD64ArgsPointerMapDifferentialTest(t *testing.T, gorootTestDir stri "-o", "-", goallcIR) machinePatterns := map[string][]string{ "p.initializedPointerResult": { - `STATEPOINT 5147424658422983495,[^\n]*\$rsp, 72,`, `STATEPOINT -[0-9]+,[^\n]*\$rsp, 0,`, }, "p.partiallyInitializedAggregateResult": { - `STATEPOINT 5147424658422983495,[^\n]*\$rsp, 80,[^\n]*\$rsp, 88,`, `STATEPOINT -[0-9]+,[^\n]*\$rsp, 0,[^\n]*\$rsp, 8,`, }, "p.liveScalarStackArgument": { - `STATEPOINT 5147424658422983495,[^\n]*\$rsp, 64,`, `STATEPOINT -[0-9]+,[^\n]*\$rsp, 72,`, }, "p.liveAggregateStackArgument": { - `STATEPOINT 5147424658422983495,[^\n]*\$rsp, 48,[^\n]*\$rsp, 64,`, `STATEPOINT -[0-9]+,[^\n]*\$rsp, 56,[^\n]*\$rsp, 72,`, }, } for name, patterns := range machinePatterns { body := llvmABIMachineFunction(t, machineIR, name) + if !regexp.MustCompile(`(?m)^.*CALL64pcrel32 &"?runtime\.morestack_noctxt"?[^\n]*$`).Match(body) { + t.Fatalf("%s PEI MIR has no raw ABI0 morestack call\n%s", name, body) + } + if regexp.MustCompile(`(?m)^.*STATEPOINT[^\n]*runtime\.morestack_noctxt[^\n]*$`).Match(body) { + t.Fatalf("%s PEI MIR still represents morestack as a statepoint\n%s", name, body) + } for _, pattern := range patterns { if !regexp.MustCompile(pattern).Match(body) { t.Fatalf("%s PEI MIR does not match %q\n%s", name, pattern, body) @@ -501,30 +503,30 @@ func runLLVMAMD64ArgsPointerMapDifferentialTest(t *testing.T, gorootTestDir stri name: "initializedPointerResult", args: 72, entryBits: []int{8}, goallcLocals: 16, goallcArgs: [][]int{{8}, nil}, goallcMaps: [][]int{nil, {1}}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{1, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{1, -1}, nativePCSP: []int32{0, 8, 0}, goallcPCSP: []int32{0, 8, 16, 8, 0}, }, { name: "partiallyInitializedAggregateResult", args: 88, entryBits: []int{9, 10}, goallcLocals: 24, goallcArgs: [][]int{{9, 10}, nil}, goallcMaps: [][]int{nil, {1, 2}}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, 0}, - nativeQueries: []int32{0, 0, -1}, goallcQueries: []int32{1, 1, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, -1}, + nativeQueries: []int32{0, 0, -1}, goallcQueries: []int32{1, 1, -1}, nativePCSP: []int32{0, 8, 0}, goallcPCSP: []int32{0, 8, 24, 8, 0}, }, { name: "liveScalarStackArgument", args: 136, entryBits: []int{7}, goallcLocals: 8, goallcArgs: [][]int{{7}}, goallcMaps: [][]int{nil}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, -1}, nativePCSP: []int32{0, 8, 0}, goallcPCSP: []int32{0, 8, 0}, }, { name: "liveAggregateStackArgument", args: 136, entryBits: []int{5, 7}, goallcLocals: 8, goallcArgs: [][]int{{5, 7}}, goallcMaps: [][]int{nil}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, -1}, nativePCSP: []int32{0, 8, 0}, goallcPCSP: []int32{0, 8, 0}, }, } @@ -654,32 +656,32 @@ func runLLVMABIArgsPointerMapSourceTest(t *testing.T, gorootTestDir, llc, opt, p nativeLocals: 8, goallcLocals: 24, nativeArgs: [][]int{{1}, nil}, goallcArgs: [][]int{{1}, nil}, nativeMaps: [][]int{nil, nil}, goallcMaps: [][]int{nil, {1}}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{1, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{-1, 1}, }, { name: "partiallyInitializedAggregateResult", args: 40, entryBits: []int{3, 4}, nativeLocals: 8, goallcLocals: 24, nativeArgs: [][]int{{3, 4}, nil}, goallcArgs: [][]int{{3, 4}, nil}, nativeMaps: [][]int{nil, nil}, goallcMaps: [][]int{nil, {0, 1}}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, 0}, - nativeQueries: []int32{0, 0, -1}, goallcQueries: []int32{1, 1, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 1, -1}, + nativeQueries: []int32{0, 0, -1}, goallcQueries: []int32{-1, 1, 1}, }, { name: "liveScalarStackArgument", args: 136, entryBits: []int{0}, nativeLocals: 8, goallcLocals: 8, nativeArgs: [][]int{{0}, nil}, goallcArgs: [][]int{{0}}, nativeMaps: [][]int{nil, nil}, goallcMaps: [][]int{nil}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{-1, 0}, }, { name: "liveAggregateStackArgument", args: 136, entryBits: []int{0, 2}, nativeLocals: 8, goallcLocals: 8, nativeArgs: [][]int{{0, 2}, nil}, goallcArgs: [][]int{{0, 2}}, nativeMaps: [][]int{nil, nil}, goallcMaps: [][]int{nil}, - nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0}, - nativeQueries: []int32{0, -1}, goallcQueries: []int32{0, 0}, + nativePCData: []int32{-1, 0, -1}, goallcPCData: []int32{-1, 0, -1}, + nativeQueries: []int32{0, -1}, goallcQueries: []int32{-1, 0}, }, } for _, tc := range cases { @@ -723,7 +725,7 @@ func runLLVMABIArgsPointerMapMachineTest(t *testing.T, goroot, llc, plugin strin [][]int{nil, nil}; !reflect.DeepEqual(got, want) { t.Fatalf("machine LocalsPointerMaps=%v, want %v", got, want) } - if got, want := llvmABIStackMapRanges(symbol), []int32{-1, 0, 1}; !reflect.DeepEqual(got, want) { + if got, want := llvmABIStackMapRanges(symbol), []int32{-1, 1}; !reflect.DeepEqual(got, want) { t.Fatalf("machine PCDATA_StackMapIndex=%v, want %v", got, want) } var queryIndexes []int32 @@ -733,7 +735,7 @@ func runLLVMABIArgsPointerMapMachineTest(t *testing.T, goroot, llc, plugin strin } queryIndexes = append(queryIndexes, query.StackMapIndex) } - if got, want := queryIndexes, []int32{0, 1}; !reflect.DeepEqual(got, want) { + if got, want := queryIndexes, []int32{-1, 1}; !reflect.DeepEqual(got, want) { t.Fatalf("machine stack-map query indexes=%v, want %v", got, want) } t.Logf("machine ArgsPointerMaps=%v LocalsPointerMaps=%v PCDATA=%v", @@ -746,7 +748,7 @@ func checkLLVMABIStatepointTupleAttrs(t *testing.T, ir []byte, callees ...string t.Helper() for _, callee := range callees { call := regexp.MustCompile(`(?m)^.*@llvm\.experimental\.gc\.statepoint.*@main\.` + - regexp.QuoteMeta(callee) + `.*#([0-9]+)$`).FindSubmatch(ir) + regexp.QuoteMeta(callee) + `.*#([0-9]+)[^\n]*$`).FindSubmatch(ir) if len(call) != 2 { t.Fatalf("rewritten IR has no attributed statepoint call to main.%s", callee) } @@ -988,11 +990,16 @@ func checkLLVMABIStackMapQueryBitmaps(t *testing.T, backend string, symbol llvmA if query.DecodeError != "" { t.Fatalf("%s stack-map query failed: %s", backend, query.DecodeError) } - if query.StackMapIndex < 0 || int(query.StackMapIndex) >= len(args) { + index := query.StackMapIndex + if index == -1 { + // runtime.stkframe.getStackMap interprets the entry sentinel as map 0. + index = 0 + } + if index < 0 || int(index) >= len(args) { t.Fatalf("%s stack-map query index %d is outside %d ArgsPointerMaps", backend, query.StackMapIndex, len(args)) } - got = append(got, args[query.StackMapIndex]) + got = append(got, args[index]) } if !reflect.DeepEqual(got, want) { t.Fatalf("%s stack-map query bitmaps=%v, want %v", backend, got, want) diff --git a/src/cmd/internal/testdir/llvm_alloca_test.go b/src/cmd/internal/testdir/llvm_alloca_test.go index 41c4da5be11ccb..04e7850acf708c 100644 --- a/src/cmd/internal/testdir/llvm_alloca_test.go +++ b/src/cmd/internal/testdir/llvm_alloca_test.go @@ -20,6 +20,8 @@ type llvmAllocaArchitectureChecks struct { restoredStorePattern string goallcLocals uint32 goallcPointerBits []int + goallcPCData []int32 + goallcQueries []int32 } var llvmAllocaChecks = map[string]llvmAllocaArchitectureChecks{ @@ -28,12 +30,16 @@ var llvmAllocaChecks = map[string]llvmAllocaArchitectureChecks{ restoredStorePattern: `(?m)^\s*(?:str|stp)\b`, goallcLocals: 88, goallcPointerBits: []int{5, 7, 8, 9}, + goallcPCData: []int32{-1, 1, -1}, + goallcQueries: []int32{-1, 1, 1, 1, 1}, }, "linux/amd64": { betweenCallsPattern: `(?s)\bcallq\s+p\.mutateLocal\n(.*?)\bcallq\s+p\.safepoint`, restoredStorePattern: `(?m)^\s*mov[a-z]*\s+[^,\n]+,\s*-[0-9]+\(%rbp\)`, goallcLocals: 88, goallcPointerBits: []int{5, 7, 8, 9}, + goallcPCData: []int32{-1, 1, -1}, + goallcQueries: []int32{1, 1, 1, 1, -1}, }, } @@ -283,8 +289,8 @@ func runLLVMAllocaStatepointTest(t *testing.T, gorootTestDir string) { checks.goallcLocals, [][]int{nil, nil}, [][]int{nil, checks.goallcPointerBits}, - []int32{-1, 1, 0}, - []int32{1, 1, 1, 1, 0}) + checks.goallcPCData, + checks.goallcQueries) goallcStackObjects := llvmABIStackObjects(t, symbol) if len(goallcStackObjects) != 0 { diff --git a/src/cmd/internal/testdir/testdata/llvm_args_pointer_maps.mir b/src/cmd/internal/testdir/testdata/llvm_args_pointer_maps.mir index eeecaa518796b7..6d71b5d8562480 100644 --- a/src/cmd/internal/testdir/testdata/llvm_args_pointer_maps.mir +++ b/src/cmd/internal/testdir/testdata/llvm_args_pointer_maps.mir @@ -7,7 +7,7 @@ ptr } - declare goabi0 void @runtime.morestack_noctxt() + declare goabi0 void @"runtime.morestack_noctxt"() declare goabiinternal void @p.safepoint() define goabiinternal %results @p.argResult(ptr %input) @@ -18,7 +18,6 @@ attributes #0 = { "frame-pointer"="non-leaf" - "go-stack-growth-statepoint" "go_results_tuple" } ... @@ -43,8 +42,9 @@ body: | bb.0.entry: liveins: $lr + STACKMAP 5147419139155979380, 0, 1, 8, $sp, 16 $x3 = COPY $lr - STATEPOINT 5147424658422983495, 0, 0, &runtime.morestack_noctxt, 2, 22, 2, 0, 2, 0, 2, 1, 1, 8, $sp, 16, 2, 0, 2, 1, 0, 0, csr_aarch64_go, implicit-def $sp, implicit-def dead early-clobber $lr, implicit $x3 + BL &"runtime.morestack_noctxt", implicit-def $lr, implicit $sp, implicit $x3 STATEPOINT 1, 0, 0, &p.safepoint, 2, 22, 2, 0, 2, 0, 2, 1, 1, 8, $sp, 8, 2, 0, 2, 1, 0, 0, csr_aarch64_go, implicit-def $sp, implicit-def dead early-clobber $lr RET_ReallyLR ... diff --git a/src/cmd/llvmplugin/testdata/aarch64-frame.ll b/src/cmd/llvmplugin/testdata/aarch64-frame.ll index 4f394c54b23fae..a2e202b7ea6fc2 100644 --- a/src/cmd/llvmplugin/testdata/aarch64-frame.ll +++ b/src/cmd/llvmplugin/testdata/aarch64-frame.ll @@ -23,7 +23,8 @@ target triple = "aarch64-apple-darwin-goobj" ; OBJVIEW-NEXT: 1 ; FRAME-TEXT-LABEL: TEXT aarch64_pointer_and_code_live(SB) -; FRAME-TEXT: R_CALLARM64:runtime.morestack_noctxt{{.*}}PCDATA_StackMapIndex=0{{.*}}ArgsPointerMaps=01{{.*}}LocalsPointerMaps=00 +; FRAME-TEXT: PCDATA_StackMapIndex=-1 +; FRAME-TEXT: R_CALLARM64:runtime.morestack_noctxt ; FRAME-TEXT-NEXT: {{.*}}stack-growth safepoint{{.*}}map[0]{{.*}}ArgsPointerMaps=01{{.*}}LocalsPointerMaps=00 ; FRAME-TEXT: R_CALLIND{{.*}}PCDATA_StackMapIndex=1{{.*}}ArgsPointerMaps=00{{.*}}LocalsPointerMaps=01 ; FRAME-TEXT-NEXT: {{.*}}ordinary safepoint{{.*}}map[1]{{.*}}ArgsPointerMaps=00{{.*}}LocalsPointerMaps=01 @@ -37,7 +38,7 @@ target triple = "aarch64-apple-darwin-goobj" ; OBJVIEW-NEXT: 0 ; OBJVIEW: "kind": "locals_pointer_maps" ; OBJVIEW: "count": 1 -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 ; OBJVIEW-NEXT: "relocation_type": "R_CALLARM64" ; OBJVIEW-LABEL: "name": "aarch64_stack_pointer_arg" @@ -49,7 +50,7 @@ target triple = "aarch64-apple-darwin-goobj" ; OBJVIEW-NEXT: 0 ; OBJVIEW: "kind": "locals_pointer_maps" ; OBJVIEW: "count": 1 -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 ; OBJVIEW-NEXT: "relocation_type": "R_CALLARM64" ; OBJVIEW-LABEL: "name": "aarch64_subword_homes" @@ -58,7 +59,7 @@ target triple = "aarch64-apple-darwin-goobj" ; OBJVIEW: "count": 1 ; OBJVIEW-NEXT: "num_bits": 1 ; OBJVIEW: "set_bits": null -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 ; OBJVIEW-NEXT: "relocation_type": "R_CALLARM64" ; OBJVIEW-LABEL: "name": "aarch64_large_arg_home" @@ -67,7 +68,7 @@ target triple = "aarch64-apple-darwin-goobj" ; OBJVIEW: "count": 1 ; OBJVIEW-NEXT: "num_bits": 4097 ; OBJVIEW: "set_bits": null -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 ; OBJVIEW-NEXT: "relocation_type": "R_CALLARM64" ; ASM: TEXT aarch64_subword_homes(SB) @@ -97,7 +98,7 @@ entry: ret ptr %result } -define goabi0 ptr @aarch64_abi0_pointer_result(ptr %pointer) #0 gc "goallc" { +define goabi0 ptr @"aarch64_abi0_pointer_result"(ptr %pointer) #0 gc "goallc" { entry: %buf = alloca [8192 x i8], align 16 %slot = getelementptr inbounds [8192 x i8], ptr %buf, i64 0, i64 8191 diff --git a/src/cmd/llvmplugin/testdata/aggregate-call-result-goobj.ll b/src/cmd/llvmplugin/testdata/aggregate-call-result-goobj.ll index 1eb42cffc7a0fe..bf3ce623032a98 100644 --- a/src/cmd/llvmplugin/testdata/aggregate-call-result-goobj.ll +++ b/src/cmd/llvmplugin/testdata/aggregate-call-result-goobj.ll @@ -10,11 +10,11 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW-NEXT: "end": [[#SAFEPOINT_START:]] ; OBJVIEW-NEXT: "value": 1 ; OBJVIEW: "start": [[#SAFEPOINT_START]] -; OBJVIEW-NEXT: "end": [[#MORESTACK_START:]] +; OBJVIEW-NEXT: "end": [[#ENTRY_DEPTH_START:]] ; OBJVIEW-NEXT: "value": 2 -; OBJVIEW: "start": [[#MORESTACK_START]] +; OBJVIEW: "start": [[#ENTRY_DEPTH_START]] ; OBJVIEW-NEXT: "end": [[#SIZE]] -; OBJVIEW-NEXT: "value": 0 +; OBJVIEW-NEXT: "value": -1 ; OBJVIEW: "kind": "args_pointer_maps" ; OBJVIEW: "count": 3 ; OBJVIEW-NEXT: "num_bits": 2 @@ -48,8 +48,7 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW: "stack_map_index": 2 ; OBJVIEW-NEXT: "relocation_type": "R_CALL" ; OBJVIEW: "sym_index": 2 -; OBJVIEW: "call_offset": [[#MORESTACK_START+1]] -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 ; OBJVIEW-NEXT: "relocation_type": "R_CALL" ; OBJVIEW: "sym_index": 3 ; OBJVIEW: "references": [ diff --git a/src/cmd/llvmplugin/testdata/conditional-relocation.ll b/src/cmd/llvmplugin/testdata/conditional-relocation.ll index d74187db6bccc9..0bb179b01533f1 100644 --- a/src/cmd/llvmplugin/testdata/conditional-relocation.ll +++ b/src/cmd/llvmplugin/testdata/conditional-relocation.ll @@ -11,11 +11,11 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW-NEXT: "end": [[#SAFEPOINT_START:]] ; OBJVIEW-NEXT: "value": -1 ; OBJVIEW: "start": [[#SAFEPOINT_START]] -; OBJVIEW-NEXT: "end": [[#MORESTACK_START:]] +; OBJVIEW-NEXT: "end": [[#ENTRY_DEPTH_START:]] ; OBJVIEW-NEXT: "value": 1 -; OBJVIEW: "start": [[#MORESTACK_START]] +; OBJVIEW: "start": [[#ENTRY_DEPTH_START]] ; OBJVIEW-NEXT: "end": [[#SIZE]] -; OBJVIEW-NEXT: "value": 0 +; OBJVIEW-NEXT: "value": -1 ; OBJVIEW: "kind": "locals_pointer_maps" ; OBJVIEW: "count": 2 ; OBJVIEW: "index": 0 @@ -25,8 +25,7 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW-NEXT: 0 ; OBJVIEW: "call_offset": [[#SAFEPOINT_START+1]] ; OBJVIEW: "stack_map_index": 1 -; OBJVIEW: "call_offset": [[#MORESTACK_START+1]] -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 declare goabiinternal void @callee() diff --git a/src/cmd/llvmplugin/testdata/debug-inline.ll b/src/cmd/llvmplugin/testdata/debug-inline.ll index 707f9f62ea5240..8546e4dfe2b8bc 100644 --- a/src/cmd/llvmplugin/testdata/debug-inline.ll +++ b/src/cmd/llvmplugin/testdata/debug-inline.ll @@ -6,12 +6,12 @@ target triple = "x86_64-unknown-linux-goobj" ; DEBUG: "parent": -1, ; DEBUG: "line": 10, ; DEBUG: "name": "main.mid", -; DEBUG-X86: "parent_pc": 6 +; DEBUG-X86: "parent_pc": 0 ; DEBUG-AARCH64: "parent_pc": 0 ; DEBUG: "parent": 0, ; DEBUG: "line": 20, ; DEBUG: "name": "main.inner", -; DEBUG-X86: "parent_pc": 7 +; DEBUG-X86: "parent_pc": 1 ; DEBUG-AARCH64: "parent_pc": 4 ; DEBUG-X86: "pc_quantum": 1, ; DEBUG-AARCH64: "pc_quantum": 4, @@ -46,7 +46,7 @@ target triple = "x86_64-unknown-linux-goobj" ; DEBUG: "parent": -1, ; DEBUG: "line": 0, ; DEBUG: "name": "main.zeroCallee", -; DEBUG-X86: "parent_pc": 6 +; DEBUG-X86: "parent_pc": 0 ; DEBUG-AARCH64: "parent_pc": 0 ; DEBUG-LABEL: "name": "main.shared", @@ -55,12 +55,12 @@ target triple = "x86_64-unknown-linux-goobj" ; DEBUG: "parent": -1, ; DEBUG: "line": 71, ; DEBUG: "name": "main.sharedLeft", -; DEBUG-X86: "parent_pc": 6 +; DEBUG-X86: "parent_pc": 0 ; DEBUG-AARCH64: "parent_pc": 0 ; DEBUG: "parent": -1, ; DEBUG: "line": 71, ; DEBUG: "name": "main.sharedRight", -; DEBUG-X86: "parent_pc": 14 +; DEBUG-X86: "parent_pc": 8 ; DEBUG-AARCH64: "parent_pc": 12 @main.sink = global i64 0 diff --git a/src/cmd/llvmplugin/testdata/multiple-calls.ll b/src/cmd/llvmplugin/testdata/multiple-calls.ll index b45b643c8d1412..8b560a5e6c2345 100644 --- a/src/cmd/llvmplugin/testdata/multiple-calls.ll +++ b/src/cmd/llvmplugin/testdata/multiple-calls.ll @@ -14,11 +14,11 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW-NEXT: "end": [[#SECOND_START:]] ; OBJVIEW-NEXT: "value": 1 ; OBJVIEW: "start": [[#SECOND_START]] -; OBJVIEW-NEXT: "end": [[#MORESTACK_START:]] +; OBJVIEW-NEXT: "end": [[#ENTRY_DEPTH_START:]] ; OBJVIEW-NEXT: "value": 2 -; OBJVIEW: "start": [[#MORESTACK_START]] +; OBJVIEW: "start": [[#ENTRY_DEPTH_START]] ; OBJVIEW-NEXT: "end": [[#SIZE]] -; OBJVIEW-NEXT: "value": 0 +; OBJVIEW-NEXT: "value": -1 ; OBJVIEW: "kind": "locals_pointer_maps" ; OBJVIEW: "count": 3 ; OBJVIEW: "index": 0 @@ -34,8 +34,7 @@ target triple = "x86_64-unknown-linux-goobj" ; OBJVIEW: "stack_map_index": 1 ; OBJVIEW: "call_offset": [[#SECOND_START+1]] ; OBJVIEW: "stack_map_index": 2 -; OBJVIEW: "call_offset": [[#MORESTACK_START+1]] -; OBJVIEW: "stack_map_index": 0 +; OBJVIEW: "stack_map_index": -1 declare goabiinternal void @first_callee() declare goabiinternal void @second_callee() diff --git a/test/codegen/_cgo_llvm_unsafe_args.go b/test/codegen/_cgo_llvm_unsafe_args.go index 902ed5053f777e..b3889b0bdf39b1 100644 --- a/test/codegen/_cgo_llvm_unsafe_args.go +++ b/test/codegen/_cgo_llvm_unsafe_args.go @@ -9,7 +9,7 @@ package codegen //go:noescape func llvmCgoUnsafeSink(*uintptr) -// LLVM-LABEL: define goabi0 i64 @codegen.llvmCgoUnsafeFrame.goallc.abi0( +// LLVM-LABEL: define goabi0 i64 @"codegen.llvmCgoUnsafeFrame"( // LLVM-SAME: i64 %p) #[[NOINLINE:[0-9]+]] gc "goallc" // LLVM-NOT: alloca // LLVM: [[FRAME:%.*]] = {{.*}}call ptr @llvm.go.abi0.frame() @@ -20,7 +20,7 @@ func llvmCgoUnsafeSink(*uintptr) // LLVM: {{.*}}call goabiinternal void @codegen.llvmCgoUnsafeSink(ptr{{.*}} [[FRAME]]) // LLVM: {{%.*}} = load i64, ptr [[RESULT]] // LLVM: attributes #[[NOINLINE]] = { {{.*}}noinline -// LLVM-OPT-LABEL: define goabi0 i64 @codegen.llvmCgoUnsafeFrame.goallc.abi0( +// LLVM-OPT-LABEL: define goabi0 i64 @"codegen.llvmCgoUnsafeFrame"( // LLVM-OPT-SAME: i64 %p) {{.*}}#[[OPT_NOINLINE:[0-9]+]] gc "goallc" // LLVM-OPT-NOT: alloca // LLVM-OPT: [[OPT_FRAME:%.*]] = {{.*}}call ptr @llvm.go.abi0.frame()