diff --git a/builtins.go b/builtins.go index 58589de7..2d43a8ed 100644 --- a/builtins.go +++ b/builtins.go @@ -5,133 +5,162 @@ import ( "os" "os/exec" "path/filepath" + "strings" ) // These are the GENERIC_SOURCES according to CMakeList.txt. var genericBuiltins = []string{ - "absvdi2", - "absvsi2", - "absvti2", - "adddf3", - "addsf3", - "addtf3", - "addvdi3", - "addvsi3", - "addvti3", - "apple_versioning", - "ashldi3", - "ashlti3", - "ashrdi3", - "ashrti3", - "bswapdi2", - "bswapsi2", - "clzdi2", - "clzsi2", - "clzti2", - "cmpdi2", - "cmpti2", - "comparedf2", - "comparesf2", - "ctzdi2", - "ctzsi2", - "ctzti2", - "divdc3", - "divdf3", - "divdi3", - "divmoddi4", - "divmodsi4", - "divsc3", - "divsf3", - "divsi3", - "divtc3", - "divti3", - "divtf3", - "extendsfdf2", - "extendhfsf2", - "ffsdi2", - "ffssi2", - "ffsti2", - "fixdfdi", - "fixdfsi", - "fixdfti", - "fixsfdi", - "fixsfsi", - "fixsfti", - "fixunsdfdi", - "fixunsdfsi", - "fixunsdfti", - "fixunssfdi", - "fixunssfsi", - "fixunssfti", - "floatdidf", - "floatdisf", - "floatsidf", - "floatsisf", - "floattidf", - "floattisf", - "floatundidf", - "floatundisf", - "floatunsidf", - "floatunsisf", - "floatuntidf", - "floatuntisf", - //"int_util", - "lshrdi3", - "lshrti3", - "moddi3", - "modsi3", - "modti3", - "muldc3", - "muldf3", - "muldi3", - "mulodi4", - "mulosi4", - "muloti4", - "mulsc3", - "mulsf3", - "multi3", - "multf3", - "mulvdi3", - "mulvsi3", - "mulvti3", - "negdf2", - "negdi2", - "negsf2", - "negti2", - "negvdi2", - "negvsi2", - "negvti2", - "os_version_check", - "paritydi2", - "paritysi2", - "parityti2", - "popcountdi2", - "popcountsi2", - "popcountti2", - "powidf2", - "powisf2", - "powitf2", - "subdf3", - "subsf3", - "subvdi3", - "subvsi3", - "subvti3", - "subtf3", - "trampoline_setup", - "truncdfhf2", - "truncdfsf2", - "truncsfhf2", - "ucmpdi2", - "ucmpti2", - "udivdi3", - "udivmoddi4", - "udivmodsi4", - "udivmodti4", - "udivsi3", - "udivti3", - "umoddi3", - "umodsi3", - "umodti3", + "absvdi2.c", + "absvsi2.c", + "absvti2.c", + "adddf3.c", + "addsf3.c", + "addtf3.c", + "addvdi3.c", + "addvsi3.c", + "addvti3.c", + "apple_versioning.c", + "ashldi3.c", + "ashlti3.c", + "ashrdi3.c", + "ashrti3.c", + "bswapdi2.c", + "bswapsi2.c", + "clzdi2.c", + "clzsi2.c", + "clzti2.c", + "cmpdi2.c", + "cmpti2.c", + "comparedf2.c", + "comparesf2.c", + "ctzdi2.c", + "ctzsi2.c", + "ctzti2.c", + "divdc3.c", + "divdf3.c", + "divdi3.c", + "divmoddi4.c", + "divmodsi4.c", + "divsc3.c", + "divsf3.c", + "divsi3.c", + "divtc3.c", + "divti3.c", + "divtf3.c", + "extendsfdf2.c", + "extendhfsf2.c", + "ffsdi2.c", + "ffssi2.c", + "ffsti2.c", + "fixdfdi.c", + "fixdfsi.c", + "fixdfti.c", + "fixsfdi.c", + "fixsfsi.c", + "fixsfti.c", + "fixunsdfdi.c", + "fixunsdfsi.c", + "fixunsdfti.c", + "fixunssfdi.c", + "fixunssfsi.c", + "fixunssfti.c", + "floatdidf.c", + "floatdisf.c", + "floatsidf.c", + "floatsisf.c", + "floattidf.c", + "floattisf.c", + "floatundidf.c", + "floatundisf.c", + "floatunsidf.c", + "floatunsisf.c", + "floatuntidf.c", + "floatuntisf.c", + //"int_util.c", + "lshrdi3.c", + "lshrti3.c", + "moddi3.c", + "modsi3.c", + "modti3.c", + "muldc3.c", + "muldf3.c", + "muldi3.c", + "mulodi4.c", + "mulosi4.c", + "muloti4.c", + "mulsc3.c", + "mulsf3.c", + "multi3.c", + "multf3.c", + "mulvdi3.c", + "mulvsi3.c", + "mulvti3.c", + "negdf2.c", + "negdi2.c", + "negsf2.c", + "negti2.c", + "negvdi2.c", + "negvsi2.c", + "negvti2.c", + "os_version_check.c", + "paritydi2.c", + "paritysi2.c", + "parityti2.c", + "popcountdi2.c", + "popcountsi2.c", + "popcountti2.c", + "powidf2.c", + "powisf2.c", + "powitf2.c", + "subdf3.c", + "subsf3.c", + "subvdi3.c", + "subvsi3.c", + "subvti3.c", + "subtf3.c", + "trampoline_setup.c", + "truncdfhf2.c", + "truncdfsf2.c", + "truncsfhf2.c", + "ucmpdi2.c", + "ucmpti2.c", + "udivdi3.c", + "udivmoddi4.c", + "udivmodsi4.c", + "udivmodti4.c", + "udivsi3.c", + "udivti3.c", + "umoddi3.c", + "umodsi3.c", + "umodti3.c", +} + +var aeabiBuiltins = []string{ + "arm/aeabi_cdcmp.S", + "arm/aeabi_cdcmpeq_check_nan.c", + "arm/aeabi_cfcmp.S", + "arm/aeabi_cfcmpeq_check_nan.c", + "arm/aeabi_dcmp.S", + "arm/aeabi_div0.c", + "arm/aeabi_drsub.c", + "arm/aeabi_fcmp.S", + "arm/aeabi_frsub.c", + "arm/aeabi_idivmod.S", + "arm/aeabi_ldivmod.S", + "arm/aeabi_memcmp.S", + "arm/aeabi_memcpy.S", + "arm/aeabi_memmove.S", + "arm/aeabi_memset.S", + "arm/aeabi_uidivmod.S", + "arm/aeabi_uldivmod.S", +} + +func builtinFiles(target string) []string { + builtins := append([]string{}, genericBuiltins...) // copy genericBuiltins + if target[:3] == "arm" { + builtins = append(builtins, aeabiBuiltins...) + } + return builtins } // Get the builtins archive, possibly generating it as needed. @@ -139,9 +168,10 @@ func loadBuiltins(target string) (path string, err error) { outfile := "librt-" + target + ".a" builtinsDir := filepath.Join(sourceDir(), "lib", "compiler-rt", "lib", "builtins") - srcs := make([]string, len(genericBuiltins)) - for i, name := range genericBuiltins { - srcs[i] = filepath.Join(builtinsDir, name+".c") + builtins := builtinFiles(target) + srcs := make([]string, len(builtins)) + for i, name := range builtins { + srcs[i] = filepath.Join(builtinsDir, name) } if path, err := cacheLoad(outfile, commands["clang"], srcs); path != "" || err != nil { @@ -156,11 +186,15 @@ func loadBuiltins(target string) (path string, err error) { // Compile all builtins. // TODO: use builtins optimized for a given target if available. - objs := make([]string, 0, len(genericBuiltins)) - for _, name := range genericBuiltins { - objpath := filepath.Join(dir, name+".o") + objs := make([]string, 0, len(builtins)) + for _, name := range builtins { + objname := name + if strings.LastIndexByte(objname, '/') >= 0 { + objname = objname[strings.LastIndexByte(objname, '/'):] + } + objpath := filepath.Join(dir, objname+".o") objs = append(objs, objpath) - srcpath := filepath.Join(builtinsDir, name+".c") + srcpath := filepath.Join(builtinsDir, name) cmd := exec.Command(commands["clang"], "-c", "-Oz", "-g", "-Werror", "-Wall", "-std=c11", "-fshort-enums", "-nostdlibinc", "--target="+target, "-o", objpath, srcpath) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr