// Operand 0 has the general form foo<>+0x04(SB).
nameAddr := p.address(operands[0])
- if !nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect) || nameAddr.Register != arch.RSB {
+ ok := nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect) || nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect|addr.Offset)
+ if !ok || nameAddr.Register != arch.RSB {
p.errorf("GLOBL symbol %q must be an offset from SB", nameAddr.Symbol)
}
name := strings.Replace(nameAddr.Symbol, "·", ".", 1)
if !valueAddr.Is(addr.ImmediateConstant | addr.Offset) {
p.errorf("FUNCDATA value must be an immediate constant")
}
- value := valueAddr.Offset
+ value0 := valueAddr.Offset
// Operand 1 is a symbol name in the form foo(SB).
// That means symbol plus indirect on SB and no offset.
nameAddr := p.address(operands[1])
- if !nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect) || nameAddr.Register != arch.RSB {
+ ok := nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect) || nameAddr.Is(addr.Symbol|addr.Register|addr.Indirect|addr.Offset)
+ if !ok || nameAddr.Register != arch.RSB {
p.errorf("FUNCDATA symbol %q must be an offset from SB", nameAddr.Symbol)
}
name := strings.Replace(nameAddr.Symbol, "·", ".", 1)
+ value1 := nameAddr.Offset
- // log.Printf("FUNCDATA %s, $%d", name, value)
+ // log.Printf("FUNCDATA $%d, %d", value0, value1)
prog := &obj.Prog{
Ctxt: p.linkCtxt,
As: int16(p.arch.AFUNCDATA),
From: obj.Addr{
Type: int16(p.arch.D_CONST),
Index: uint8(p.arch.D_NONE),
- Offset: value,
+ Offset: value0,
},
To: obj.Addr{
- Type: int16(p.symbolType(&nameAddr)),
- Index: uint8(p.arch.D_NONE),
- Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Type: int16(p.symbolType(&nameAddr)),
+ Index: uint8(p.arch.D_NONE),
+ Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Offset: value1,
},
}
p.append(prog, true)
os.Exit(2)
}
-func Parse(goroot, goos, goarch string, theChar int) { // TODO: see below
+func Parse(theChar int) {
flag.Usage = Usage
flag.Parse()
if flag.NArg() != 1 {
}
*OutputFile = fmt.Sprintf("%s.%c", input, theChar)
}
- // Initialize to include $GOROOT/pkg/$GOOS_GOARCH/ so we find textflag.h
- // TODO: Delete last line once asm is installed because the go command takes care of this.
- // The arguments to Parse can be simplified then too.
- I = append(I, filepath.Join(goroot, "pkg", fmt.Sprintf("%s_%s", goos, goarch)))
}
import (
"flag"
"fmt"
- "go/build"
"log"
"os"
log.SetFlags(0)
log.SetPrefix("asm: ")
- GOARCH := build.Default.GOARCH
+ GOARCH := obj.Getgoarch()
architecture := arch.Set(GOARCH)
if architecture == nil {
log.Fatalf("asm: unrecognized architecture %s", GOARCH)
}
- flags.Parse(obj.Getgoroot(), obj.Getgoos(), obj.Getgoarch(), architecture.Thechar)
+ flags.Parse(architecture.Thechar)
// Create object file, write header.
fd, err := os.Create(*flags.OutputFile)