You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			123 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
[!cgo] skip 'this test requires cgo to be enabled'
 | 
						|
 | 
						|
garble build
 | 
						|
! stderr 'warning' # check that the C toolchain is happy
 | 
						|
exec ./main
 | 
						|
cmp stdout main.stdout
 | 
						|
! binsubstr main$exe 'PortedField' 'test/main'
 | 
						|
 | 
						|
[short] stop # no need to verify this with -short
 | 
						|
 | 
						|
# Ensure that reversing works with cgo.
 | 
						|
env GARBLE_TEST_REVERSING=true
 | 
						|
exec ./main
 | 
						|
cp stdout reversing.stdout
 | 
						|
stdin reversing.stdout
 | 
						|
garble reverse .
 | 
						|
cmp stdout reversed.stdout
 | 
						|
env GARBLE_TEST_REVERSING=false
 | 
						|
 | 
						|
garble -tiny build
 | 
						|
exec ./main
 | 
						|
cmp stdout main.stdout
 | 
						|
 | 
						|
go build
 | 
						|
! stderr 'warning' # check that the C toolchain is happy
 | 
						|
exec ./main
 | 
						|
cmp stdout main.stdout
 | 
						|
binsubstr main$exe 'privateAdd'
 | 
						|
-- go.mod --
 | 
						|
module test/main
 | 
						|
 | 
						|
go 1.19
 | 
						|
-- main.go --
 | 
						|
package main
 | 
						|
 | 
						|
func main() {
 | 
						|
	regularFunc()
 | 
						|
	cgoFunc()
 | 
						|
}
 | 
						|
-- regular_main.go --
 | 
						|
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"runtime"
 | 
						|
)
 | 
						|
 | 
						|
func regularFunc() {
 | 
						|
	if os.Getenv("GARBLE_TEST_REVERSING") == "true" {
 | 
						|
		_, filename, _, _ := runtime.Caller(0)
 | 
						|
		fmt.Println("regular filename:", filename)
 | 
						|
	}
 | 
						|
}
 | 
						|
-- cgo_main.go --
 | 
						|
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"os/user"
 | 
						|
	"runtime"
 | 
						|
)
 | 
						|
 | 
						|
/*
 | 
						|
#include "separate.h"
 | 
						|
 | 
						|
static int privateAdd(int a, int b) {
 | 
						|
	return a + b;
 | 
						|
}
 | 
						|
 | 
						|
extern void goCallback();
 | 
						|
 | 
						|
static void callGoCallback() {
 | 
						|
	goCallback();
 | 
						|
	separateFunction();
 | 
						|
}
 | 
						|
 | 
						|
struct portedStruct {
 | 
						|
	char* PortedField;
 | 
						|
};
 | 
						|
*/
 | 
						|
import "C"
 | 
						|
 | 
						|
func cgoFunc() {
 | 
						|
	fmt.Println(C.privateAdd(C.int(1), C.int(2)))
 | 
						|
	_, _ = user.Current()
 | 
						|
 | 
						|
	st := C.struct_portedStruct{}
 | 
						|
	fmt.Println(st.PortedField == nil)
 | 
						|
 | 
						|
	C.callGoCallback()
 | 
						|
}
 | 
						|
 | 
						|
//export goCallback
 | 
						|
func goCallback() {
 | 
						|
	fmt.Println("go callback")
 | 
						|
	// TODO: support reversing filenames in cgo files
 | 
						|
	if false && os.Getenv("GARBLE_TEST_REVERSING") == "true" {
 | 
						|
		_, filename, _, _ := runtime.Caller(0)
 | 
						|
		fmt.Println("cgo filename:", filename)
 | 
						|
	}
 | 
						|
}
 | 
						|
-- separate.h --
 | 
						|
void separateFunction();
 | 
						|
-- separate.c --
 | 
						|
#include "_cgo_export.h"
 | 
						|
 | 
						|
void separateFunction() {
 | 
						|
	goCallback();
 | 
						|
}
 | 
						|
-- main.stdout --
 | 
						|
3
 | 
						|
true
 | 
						|
go callback
 | 
						|
go callback
 | 
						|
-- reversed.stdout --
 | 
						|
regular filename: test/main/regular_main.go
 | 
						|
3
 | 
						|
true
 | 
						|
go callback
 | 
						|
go callback
 |