diff --git a/build_defs/go.build_defs b/build_defs/go.build_defs index 741db108..8de215fd 100644 --- a/build_defs/go.build_defs +++ b/build_defs/go.build_defs @@ -424,9 +424,22 @@ def go_library(name:str, srcs:list, resources:list=[], asm_srcs:list=None, hdrs: 'hdrs': [hdrs_rule], 'goasm': [lib_rule + '|h'], }, - outs = [name + '.o'], + outs = [name + "#" + (splitext(basename(a)))[0] + ".o" for a in asm_srcs], building_description = 'Assembling...', - cmd = f'eval `"$TOOL" env` && mkdir include && mv $SRCS_GOASM include/go_asm.h && "$TOOL" tool asm -trimpath "$TMP_DIR" -I "$TMP_DIR"/include -I ${GOROOT}/pkg/include -D GOOS={CONFIG.OS} -D GOARCH_{CONFIG.ARCH} -p {package_path} -o "$OUT" $SRCS_ASM', + cmd = " && ".join([ + 'eval `"$TOOL" env`', + 'mkdir include', + 'mv $SRCS_GOASM include/go_asm.h', + 'for ASM_FILE in $SRCS_ASM; do "$TOOL" tool asm ' + " ".join([ + '-trimpath "$TMP_DIR"', + '-I "$TMP_DIR"/include', + '-I ${GOROOT}/pkg/include', + f'-D GOOS={CONFIG.OS}', + f'-D GOARCH_{CONFIG.ARCH}', + f'-p {package_path}', + f'''-o "{name}#$(basename $ASM_FILE | sed -e 's/\.[sS]$//').o"''', + ]) + ' $ASM_FILE; done', + ]), env= { "GOOS": CONFIG.OS, "GOARCH": CONFIG.ARCH, diff --git a/test/asm/lib/BUILD b/test/asm/lib/BUILD index a084a748..e66eecf1 100644 --- a/test/asm/lib/BUILD +++ b/test/asm/lib/BUILD @@ -3,7 +3,10 @@ subinclude("//build_defs:go") go_library( name = "asm", srcs = ["asm.go"], - asm_srcs = ["add.s"], + asm_srcs = [ + "add.s", + "subtract.s", + ], deps = ["//test/asm/lib/golib"], ) diff --git a/test/asm/lib/add.s b/test/asm/lib/add.s index 94a24c33..927ac283 100644 --- a/test/asm/lib/add.s +++ b/test/asm/lib/add.s @@ -1,3 +1,5 @@ +GLOBL COLLIDINGSYMBOL<>(SB), 8, $32 + // func add(x, y int64) TEXT ·add(SB),$0-24 MOVQ x+0(FP), BX diff --git a/test/asm/lib/asm.go b/test/asm/lib/asm.go index f0520853..34104a68 100644 --- a/test/asm/lib/asm.go +++ b/test/asm/lib/asm.go @@ -10,3 +10,11 @@ func add(x, y int64) int64 func Add() int { return int(add(golib.LHS, golib.RHS)) } + +// subtract is the forward declaration of the assembly implementation. +func subtract(x, y int) int64 + +// Subtract subtracts two numbers using assembly. +func Subtract() int { + return int(subtract(golib.LHS, golib.RHS)) +} diff --git a/test/asm/lib/asm_test.go b/test/asm/lib/asm_test.go index 4809113e..29e0df0b 100644 --- a/test/asm/lib/asm_test.go +++ b/test/asm/lib/asm_test.go @@ -11,5 +11,9 @@ import ( ) func TestAssemblyAdd(t *testing.T) { - assert.Equal(t, 15, asm.Add()) + assert.Equal(t, 14, asm.Add()) +} + +func TestAssemblySubtract(t *testing.T) { + assert.Equal(t, 6, asm.Subtract()) } diff --git a/test/asm/lib/golib/go_lib.go b/test/asm/lib/golib/go_lib.go index 8bcb60ce..560e6a18 100644 --- a/test/asm/lib/golib/go_lib.go +++ b/test/asm/lib/golib/go_lib.go @@ -1,4 +1,4 @@ package golib -const LHS = 5 -const RHS = 10 +const LHS = 10 +const RHS = 4 diff --git a/test/asm/lib/subtract.s b/test/asm/lib/subtract.s new file mode 100644 index 00000000..714039f4 --- /dev/null +++ b/test/asm/lib/subtract.s @@ -0,0 +1,9 @@ +GLOBL COLLIDINGSYMBOL<>(SB), 8, $32 + +// func subtract(x, y int64) +TEXT ·subtract(SB),$0-24 + MOVQ x+0(FP), BX + MOVQ y+8(FP), BP + SUBQ BP, BX + MOVQ BX, ret+16(FP) + RET