if architecture == nil {
panic("asm: unrecognized architecture " + goarch)
}
- return architecture, obj.Linknew(architecture.LinkArch)
+ ctxt := obj.Linknew(architecture.LinkArch)
+ ctxt.Pkgpath = "pkg"
+ return architecture, ctxt
}
func newParser(goarch string) *Parser {
{"x·y+8(SB)", "x.y+8(SB)"},
{"x·y+8(SP)", "x.y+8(SP)"},
{"y+56(FP)", "y+56(FP)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·callReflect(SB)", "\"\".callReflect(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·callReflect(SB)", "pkg.callReflect(SB)"},
{"[X0-X0]", "[X0-X0]"},
{"[ Z9 - Z12 ]", "[Z9-Z12]"},
{"[X0-AX]", "[X0-AX]"},
{"sec+4(FP)", "sec+4(FP)"},
{"shifts<>(SB)(CX*8)", "shifts<>(SB)(CX*8)"},
{"x+4(FP)", "x+4(FP)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·reflectcall(SB)", "\"\".reflectcall(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·reflectcall(SB)", "pkg.reflectcall(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
{"gosave<>(SB)", "gosave<>(SB)"},
{"retlo+12(FP)", "retlo+12(FP)"},
{"runtime·gogo(SB)", "runtime.gogo(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
{"(R1, R3)", "(R1, R3)"},
{"[R0,R1,g,R15", ""}, // Issue 11764 - asm hung parsing ']' missing register lists.
{"[):[o-FP", ""}, // Issue 12469 - there was no infinite loop for ARM; these are just sanity checks.
{"g", "g"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·trunc(SB)", "pkg.trunc(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
{"$(8-1)", "$7"},
{"a+0(FP)", "a(FP)"},
{"a1+8(FP)", "a1+8(FP)"},
- {"·AddInt32(SB)", `"".AddInt32(SB)`},
+ {"·AddInt32(SB)", `pkg.AddInt32(SB)`},
{"runtime·divWVW(SB)", "runtime.divWVW(SB)"},
{"$argframe+0(FP)", "$argframe(FP)"},
{"$asmcgocall<>(SB)", "$asmcgocall<>(SB)"},
{"RSB", "R28"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·trunc(SB)", "pkg.trunc(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
{"g", "g"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·trunc(SB)", "pkg.trunc(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
{"g", "g"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·trunc(SB)", "pkg.trunc(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
{"g", "g"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
- {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
- {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"·AddUint32(SB)", "pkg.AddUint32(SB)"},
+ {"·trunc(SB)", "pkg.trunc(SB)"},
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
"log"
"os"
"strconv"
+ "strings"
"text/scanner"
"unicode/utf8"
dataAddr map[string]int64 // Most recent address for DATA for this symbol.
isJump bool // Instruction being assembled is a jump.
allowABI bool // Whether ABI selectors are allowed.
+ pkgPrefix string // Prefix to add to local symbols.
errorWriter io.Writer
}
}
func NewParser(ctxt *obj.Link, ar *arch.Arch, lexer lex.TokenReader) *Parser {
+ pkgPrefix := obj.UnlinkablePkg
+ if ctxt != nil {
+ pkgPrefix = objabi.PathToPrefix(ctxt.Pkgpath)
+ }
return &Parser{
ctxt: ctxt,
arch: ar,
dataAddr: make(map[string]int64),
errorWriter: os.Stderr,
allowABI: ctxt != nil && objabi.LookupPkgSpecial(ctxt.Pkgpath).AllowAsmABI,
+ pkgPrefix: pkgPrefix,
}
}
fallthrough
default:
// We have a symbol. Parse $sym±offset(symkind)
- p.symbolReference(a, name, prefix)
+ p.symbolReference(a, p.qualifySymbol(name), prefix)
}
// fmt.Printf("SYM %s\n", obj.Dconv(&emptyProg, 0, a))
if p.peek() == scanner.EOF {
}
}
+// qualifySymbol returns name as a package-qualified symbol name. If
+// name starts with a period, qualifySymbol prepends the package
+// prefix. Otherwise it returns name unchanged.
+func (p *Parser) qualifySymbol(name string) string {
+ if strings.HasPrefix(name, ".") {
+ name = p.pkgPrefix + name
+ }
+ return name
+}
+
// symbolReference parses a symbol that is known not to be a register.
func (p *Parser) symbolReference(a *obj.Addr, name string, prefix rune) {
// Identifier is a name.
if tok.ScanToken != scanner.Ident || p.atStartOfRegister(name) {
return "", obj.ABI0, false
}
+ name = p.qualifySymbol(name)
// Parse optional <> (indicates a static symbol) or
// <ABIxxx> (selecting text symbol with specific ABI).
noErrMsg := false