aboutsummaryrefslogtreecommitdiffstats
path: root/sys/syz-extract/fuchsia.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-10-02 16:00:18 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-10-12 18:16:25 +0200
commit02a7a5401946658aa06fd618cf36e6848b0078fd (patch)
tree5f19702ad8c9218ac10b09a8b058183f0d21553e /sys/syz-extract/fuchsia.go
parent95a2bea7956f6346c11577645df96e13fe7fec3d (diff)
sys/syz-extract: factor out compilation function
Each arch duplicates significant portion of logic to compile the extract source file. Factor this logic into a separate function and reuse it across all OSes.
Diffstat (limited to 'sys/syz-extract/fuchsia.go')
-rw-r--r--sys/syz-extract/fuchsia.go73
1 files changed, 8 insertions, 65 deletions
diff --git a/sys/syz-extract/fuchsia.go b/sys/syz-extract/fuchsia.go
index f3cab132f..b693f38ad 100644
--- a/sys/syz-extract/fuchsia.go
+++ b/sys/syz-extract/fuchsia.go
@@ -5,11 +5,7 @@ package main
import (
"fmt"
- "io/ioutil"
- "os"
- "os/exec"
"path/filepath"
- "strings"
"github.com/google/syzkaller/pkg/compiler"
)
@@ -28,65 +24,12 @@ func (*fuchsia) prepareArch(arch *Arch) error {
}
func (*fuchsia) processFile(arch *Arch, info *compiler.ConstInfo) (map[string]uint64, map[string]bool, error) {
- bin, out, err := fuchsiaCompile(arch.sourceDir, info.Consts, info.Includes, info.Incdirs, info.Defines)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to run compiler: %v\n%v", err, string(out))
- }
- defer os.Remove(bin)
- res, err := runBinaryAndParse(bin, info.Consts, nil)
- if err != nil {
- return nil, nil, err
- }
- return res, nil, nil
-}
-
-func fuchsiaCompile(sourceDir string, vals, includes, incdirs []string, defines map[string]string) (bin string, out []byte, err error) {
- includeText := ""
- for _, inc := range includes {
- includeText += fmt.Sprintf("#include <%v>\n", inc)
- }
- definesText := ""
- for k, v := range defines {
- definesText += fmt.Sprintf("#ifndef %v\n#define %v %v\n#endif\n", k, k, v)
- }
- valsText := strings.Join(vals, ",")
- src := fuchsiaSrc
- src = strings.Replace(src, "[[INCLUDES]]", includeText, 1)
- src = strings.Replace(src, "[[DEFAULTS]]", definesText, 1)
- src = strings.Replace(src, "[[VALS]]", valsText, 1)
- binFile, err := ioutil.TempFile("", "")
- if err != nil {
- return "", nil, fmt.Errorf("failed to create temp file: %v", err)
- }
- binFile.Close()
- compiler := filepath.Join(sourceDir, "buildtools", "linux-x64", "clang", "bin", "clang")
- includeDir := filepath.Join(sourceDir, "out", "build-zircon", "build-zircon-pc-x86-64", "sysroot", "include")
- args := []string{"-x", "c", "-", "-o", binFile.Name(), "-fmessage-length=0", "-w", "-I", includeDir}
- for _, incdir := range incdirs {
- args = append(args, "-I"+sourceDir+"/"+incdir)
- }
- cmd := exec.Command(compiler, args...)
- cmd.Stdin = strings.NewReader(src)
- out, err = cmd.CombinedOutput()
- if err != nil {
- os.Remove(binFile.Name())
- return "", out, err
- }
- return binFile.Name(), nil, nil
-}
-
-var fuchsiaSrc = `
-[[INCLUDES]]
-[[DEFAULTS]]
-int printf(const char *format, ...);
-int main() {
- int i;
- unsigned long long vals[] = {[[VALS]]};
- for (i = 0; i < sizeof(vals)/sizeof(vals[0]); i++) {
- if (i != 0)
- printf(" ");
- printf("%llu", vals[i]);
- }
- return 0;
+ dir := arch.sourceDir
+ cc := filepath.Join(dir, "buildtools", "linux-x64", "clang", "bin", "clang")
+ includeDir := filepath.Join(dir, "out", "build-zircon", "build-zircon-pc-x86-64", "sysroot", "include")
+ args := []string{"-fmessage-length=0", "-I" + includeDir}
+ for _, incdir := range info.Incdirs {
+ args = append(args, "-I"+filepath.Join(dir, incdir))
+ }
+ return extract(info, cc, args, "")
}
-`