next++
}
+ // Issue an error if we see a function defined as ABIInternal
+ // without NOSPLIT. In ABIInternal, obj needs to know the function
+ // signature in order to construct the morestack path, so this
+ // currently isn't supported for asm functions.
+ if nameAddr.Sym.ABI() == obj.ABIInternal && flag&obj.NOSPLIT == 0 {
+ p.errorf("TEXT %q: ABIInternal requires NOSPLIT", name)
+ }
+
// Next operand is the frame and arg size.
// Bizarre syntax: $frameSize-argSize is two words, not subtraction.
// Both frameSize and argSize must be simple integers; only frameSize
func TestErroneous(t *testing.T) {
- tests := []struct {
+ type errtest struct {
pseudo string
operands string
expected string
- }{
+ }
+
+ nonRuntimeTests := []errtest{
{"TEXT", "", "expect two or three operands for TEXT"},
{"TEXT", "%", "expect two or three operands for TEXT"},
{"TEXT", "1, 1", "TEXT symbol \"<erroneous symbol>\" must be a symbol(SB)"},
{"PCDATA", "1", "expect two operands for PCDATA"},
}
+ runtimeTests := []errtest{
+ {"TEXT", "foo<ABIInternal>(SB),0", "TEXT \"foo\": ABIInternal requires NOSPLIT"},
+ }
+
+ testcats := []struct {
+ compilingRuntime bool
+ tests []errtest
+ }{
+ {
+ compilingRuntime: false,
+ tests: nonRuntimeTests,
+ },
+ {
+ compilingRuntime: true,
+ tests: runtimeTests,
+ },
+ }
+
// Note these errors should be independent of the architecture.
// Just run the test with amd64.
parser := newParser("amd64")
var buf bytes.Buffer
parser.errorWriter = &buf
- for _, test := range tests {
- parser.errorCount = 0
- parser.lineNum++
- if !parser.pseudo(test.pseudo, tokenize(test.operands)) {
- t.Fatalf("Wrong pseudo-instruction: %s", test.pseudo)
- }
- errorLine := buf.String()
- if test.expected != errorLine {
- t.Errorf("Unexpected error %q; expected %q", errorLine, test.expected)
+ for _, cat := range testcats {
+ for _, test := range cat.tests {
+ parser.compilingRuntime = cat.compilingRuntime
+ parser.errorCount = 0
+ parser.lineNum++
+ if !parser.pseudo(test.pseudo, tokenize(test.operands)) {
+ t.Fatalf("Wrong pseudo-instruction: %s", test.pseudo)
+ }
+ errorLine := buf.String()
+ if test.expected != errorLine {
+ t.Errorf("Unexpected error %q; expected %q", errorLine, test.expected)
+ }
+ buf.Reset()
}
- buf.Reset()
}
}