mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Trying to improve linux linking.
This commit is contained in:
committed by
Christoffer Lerno
parent
bad3ea124d
commit
bf36dbc4e7
@@ -192,7 +192,6 @@ void project_add_target(Project *project, TomlValue *wrapped_table, const char *
|
||||
target->pie = get_valid_string_setting(table, "pie", type, pies, 0, 3, "'yes-limited', 'yes-unlimited' or 'no'.");
|
||||
target->pic = get_valid_string_setting(table, "pic", type, pies, 0, 3, "'yes-limited', 'yes-unlimited' or 'no'.");
|
||||
|
||||
target->pic = PIC_DEFAULT;
|
||||
target->feature.no_memcpy_pass = get_valid_bool(table, "no-memcpy-pass", type, false);
|
||||
target->feature.trap_on_wrap = get_valid_bool(table, "trap-on-wrap", type, false);
|
||||
// Use the fact that they correspond to 0, 1, -1
|
||||
|
||||
@@ -32,12 +32,14 @@ static void link_exe(const char *output_file, const char **files_to_link, unsign
|
||||
vec_add(args, "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk");
|
||||
break;
|
||||
case OS_TYPE_LINUX:
|
||||
vec_add(args, "-L/");
|
||||
vec_add(args, "-lc");
|
||||
vec_add(args, "-lm");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
vec_add(args, platform_target.pie ? "-pie" : "-no_pie");
|
||||
|
||||
bool success;
|
||||
switch (platform_target.object_format)
|
||||
|
||||
@@ -18,7 +18,7 @@ static unsigned os_target_supports_int128(OsType os, ArchType arch);
|
||||
static unsigned os_target_supports_float16(OsType os, ArchType arch);
|
||||
static unsigned os_target_supports_float128(OsType os, ArchType arch);
|
||||
static unsigned os_target_supports_vec(OsType os, ArchType arch, int bits, bool is_int);
|
||||
|
||||
static bool os_requires_libc(OsType os);
|
||||
|
||||
|
||||
PlatformTarget platform_target = {};
|
||||
@@ -600,56 +600,21 @@ static unsigned arch_pointer_bit_width(OsType os, ArchType arch)
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_UNSUPPORTED:
|
||||
return 0;
|
||||
case ARCH_TYPE_MSP430:
|
||||
case ARCH_TYPE_AVR:
|
||||
return 16;
|
||||
case ARCH_TYPE_ARM:
|
||||
case ARCH_TYPE_ARMB:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_THUMB:
|
||||
case ARCH_TYPE_THUMBEB:
|
||||
case ARCH_TYPE_X86:
|
||||
case ARCH_TYPE_XCORE:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
return 32;
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_TYPE_WASM64:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
return 64;
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
@@ -719,36 +684,14 @@ static ObjectFormatType object_format_from_os(OsType os)
|
||||
{
|
||||
switch (os)
|
||||
{
|
||||
case OS_UNSUPPORTED:
|
||||
return OBJ_FORMAT_UNSUPPORTED;
|
||||
case OS_TYPE_LINUX:
|
||||
case OS_TYPE_UNKNOWN:
|
||||
case OS_TYPE_NETBSD:
|
||||
case OS_TYPE_OPENBSD:
|
||||
return OBJ_FORMAT_ELF;
|
||||
case OS_TYPE_ANANAS:
|
||||
case OS_TYPE_CLOUD_ABI:
|
||||
case OS_TYPE_DRAGON_FLY:
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_FUCHSIA:
|
||||
case OS_TYPE_KFREEBSD:
|
||||
case OS_TYPE_PS3:
|
||||
case OS_TYPE_SOLARIS:
|
||||
case OS_TYPE_HAIKU:
|
||||
case OS_TYPE_MINIX:
|
||||
case OS_TYPE_RTEMS:
|
||||
case OS_TYPE_NACL:
|
||||
case OS_TYPE_CNK:
|
||||
case OS_TYPE_CUDA:
|
||||
case OS_TYPE_NVOPENCL:
|
||||
case OS_TYPE_AMDHSA:
|
||||
case OS_TYPE_PS4:
|
||||
case OS_TYPE_ELFIAMCU:
|
||||
case OS_TYPE_MESA3D:
|
||||
case OS_TYPE_CONTIKI:
|
||||
case OS_TYPE_AMDPAL:
|
||||
case OS_TYPE_HERMITCORE:
|
||||
case OS_TYPE_HURD:
|
||||
case OS_TYPE_EMSCRIPTEN:
|
||||
return OBJ_FORMAT_UNSUPPORTED;
|
||||
return OBJ_FORMAT_ELF;
|
||||
case OS_TYPE_MACOSX:
|
||||
case OS_TYPE_IOS:
|
||||
case OS_TYPE_TVOS:
|
||||
@@ -756,8 +699,6 @@ static ObjectFormatType object_format_from_os(OsType os)
|
||||
return OBJ_FORMAT_MACHO;
|
||||
case OS_TYPE_WIN32:
|
||||
return OBJ_FORMAT_COFF;
|
||||
case OS_TYPE_AIX:
|
||||
return OBJ_FORMAT_XCOFF;
|
||||
case OS_TYPE_WASI:
|
||||
return OBJ_FORMAT_WASM;
|
||||
}
|
||||
@@ -779,6 +720,8 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type)
|
||||
{
|
||||
switch (os)
|
||||
{
|
||||
case OS_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case OS_TYPE_UNKNOWN:
|
||||
if (arch == ARCH_TYPE_MSP430)
|
||||
{
|
||||
@@ -801,10 +744,8 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type)
|
||||
case OS_TYPE_LINUX:
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_NETBSD:
|
||||
case OS_TYPE_DRAGON_FLY:
|
||||
case OS_TYPE_OPENBSD:
|
||||
case OS_TYPE_WASI:
|
||||
case OS_TYPE_EMSCRIPTEN:
|
||||
// Use default
|
||||
break;
|
||||
case OS_TYPE_WIN32:
|
||||
@@ -821,6 +762,8 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type)
|
||||
UNREACHABLE
|
||||
}
|
||||
case OS_TYPE_IOS:
|
||||
case OS_TYPE_TVOS:
|
||||
case OS_TYPE_WATCHOS:
|
||||
switch (type)
|
||||
{
|
||||
case CTYPE_SHORT:
|
||||
@@ -833,31 +776,6 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type)
|
||||
default:
|
||||
UNREACHABLE
|
||||
}
|
||||
case OS_TYPE_ANANAS:
|
||||
case OS_TYPE_CLOUD_ABI:
|
||||
case OS_TYPE_FUCHSIA:
|
||||
case OS_TYPE_KFREEBSD:
|
||||
case OS_TYPE_PS3:
|
||||
case OS_TYPE_SOLARIS:
|
||||
case OS_TYPE_HAIKU:
|
||||
case OS_TYPE_MINIX:
|
||||
case OS_TYPE_RTEMS:
|
||||
case OS_TYPE_NACL:
|
||||
case OS_TYPE_CNK:
|
||||
case OS_TYPE_AIX:
|
||||
case OS_TYPE_CUDA:
|
||||
case OS_TYPE_NVOPENCL:
|
||||
case OS_TYPE_AMDHSA:
|
||||
case OS_TYPE_PS4:
|
||||
case OS_TYPE_ELFIAMCU:
|
||||
case OS_TYPE_TVOS:
|
||||
case OS_TYPE_WATCHOS:
|
||||
case OS_TYPE_MESA3D:
|
||||
case OS_TYPE_CONTIKI:
|
||||
case OS_TYPE_AMDPAL:
|
||||
case OS_TYPE_HERMITCORE:
|
||||
case OS_TYPE_HURD:
|
||||
TODO
|
||||
}
|
||||
switch (type)
|
||||
{
|
||||
@@ -880,22 +798,7 @@ static unsigned os_target_alignment_of_int(OsType os, ArchType arch, int bits)
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case ARCH_TYPE_ARM:
|
||||
case ARCH_TYPE_THUMB:
|
||||
@@ -905,38 +808,18 @@ static unsigned os_target_alignment_of_int(OsType os, ArchType arch, int bits)
|
||||
case ARCH_TYPE_THUMBEB:
|
||||
if (os == OS_TYPE_NETBSD && bits > 32) return 4;
|
||||
return bits > 64 ? 8 : bits / 8;
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
case ARCH_TYPE_X86_64:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_WASM64:
|
||||
return bits > 64 ? 8 : bits / 8;
|
||||
case ARCH_TYPE_XCORE:
|
||||
return bits > 32 ? 4 : bits / 8;
|
||||
case ARCH_TYPE_MSP430:
|
||||
return bits > 16 ? 2 : bits / 8;
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_X86:
|
||||
if (bits >= 64)
|
||||
@@ -955,56 +838,22 @@ static unsigned arch_little_endian(ArchType arch)
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_TYPE_X86:
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
case ARCH_TYPE_ARM:
|
||||
case ARCH_TYPE_THUMB:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_MSP430:
|
||||
case ARCH_TYPE_X86_64:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_XCORE:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_WASM64:
|
||||
return true;
|
||||
case ARCH_TYPE_ARMB:
|
||||
case ARCH_TYPE_THUMBEB:
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
case ARCH_TYPE_LANAI:
|
||||
return false;
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
}
|
||||
UNREACHABLE
|
||||
@@ -1015,69 +864,29 @@ static unsigned os_target_pref_alignment_of_int(OsType os, ArchType arch, int bi
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case ARCH_TYPE_X86:
|
||||
if (os == OS_TYPE_ELFIAMCU && bits > 32) return 4;
|
||||
return bits > 64 ? 8 : bits / 8;
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
if (bits < 32 && !os_is_apple(os) && os != OS_TYPE_WIN32) return 4;
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
return bits < 32 ? 4 : bits / 8;
|
||||
case ARCH_TYPE_ARM:
|
||||
case ARCH_TYPE_ARMB:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_THUMB:
|
||||
case ARCH_TYPE_THUMBEB:
|
||||
case ARCH_TYPE_X86_64:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_WASM64:
|
||||
return bits < 64 ? bits / 8 : 8;
|
||||
case ARCH_TYPE_XCORE:
|
||||
return 4;
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
if (bits <= 16) return 2;
|
||||
return bits < 64 ? bits / 8 : 8;
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
if (bits < 32) return 4;
|
||||
return bits < 64 ? bits / 8 : 8;
|
||||
case ARCH_TYPE_MSP430:
|
||||
return bits < 16 ? bits / 8 : 2;
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
return bits / 8;
|
||||
}
|
||||
UNREACHABLE
|
||||
@@ -1088,22 +897,7 @@ static unsigned os_target_alignment_of_float(OsType os, ArchType arch, int bits)
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case ARCH_TYPE_X86:
|
||||
if (os == OS_TYPE_ELFIAMCU && bits >= 32) return 4;
|
||||
@@ -1114,30 +908,14 @@ static unsigned os_target_alignment_of_float(OsType os, ArchType arch, int bits)
|
||||
return bits == 64 ? 4 : bits / 8;
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_WASM64:
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_MSP430:
|
||||
return bits < 128 ? 2 : 16;
|
||||
case ARCH_TYPE_ARM:
|
||||
case ARCH_TYPE_THUMB:
|
||||
if ((os_is_apple(os) || os == OS_TYPE_NETBSD) && bits == 64)
|
||||
@@ -1152,16 +930,87 @@ static unsigned os_target_alignment_of_float(OsType os, ArchType arch, int bits)
|
||||
return 4;
|
||||
}
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
return bits < 64 ? bits / 8 : 8;
|
||||
case ARCH_TYPE_X86_64:
|
||||
if (bits == 128 && os == OS_TYPE_ELFIAMCU) return 4;
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_XCORE:
|
||||
if (bits == 64) return 4;
|
||||
return bits / 8;
|
||||
}
|
||||
UNREACHABLE
|
||||
}
|
||||
|
||||
static const char *os_dynamic_library_suffix(OsType os)
|
||||
{
|
||||
if (os_is_apple(os)) return ".dylib";
|
||||
if (os == OS_TYPE_WIN32) return ".dll";
|
||||
return ".so";
|
||||
}
|
||||
|
||||
static PicGeneration arch_os_pic_default(ArchType arch, OsType os)
|
||||
{
|
||||
switch (os)
|
||||
{
|
||||
case OS_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case OS_TYPE_OPENBSD:
|
||||
case OS_DARWIN_TYPES:
|
||||
return PIC_SMALL;
|
||||
case OS_TYPE_WIN32:
|
||||
return ARCH_TYPE_X86_64 == arch;
|
||||
case OS_TYPE_WASI:
|
||||
return PIC_NONE;
|
||||
case OS_TYPE_UNKNOWN:
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_LINUX:
|
||||
case OS_TYPE_NETBSD:
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
return PIC_SMALL;
|
||||
default:
|
||||
return PIC_NONE;
|
||||
}
|
||||
}
|
||||
UNREACHABLE
|
||||
}
|
||||
static bool arch_os_pic_default_forced(ArchType arch, OsType os)
|
||||
{
|
||||
switch (os)
|
||||
{
|
||||
case OS_TYPE_WIN32:
|
||||
return arch == ARCH_TYPE_X86_64;
|
||||
case OS_DARWIN_TYPES:
|
||||
return arch == ARCH_TYPE_AARCH64 || arch == ARCH_TYPE_X86_64;
|
||||
case OS_TYPE_WASI:
|
||||
case OS_TYPE_UNKNOWN:
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_LINUX:
|
||||
case OS_TYPE_NETBSD:
|
||||
case OS_TYPE_OPENBSD:
|
||||
return false;
|
||||
case OS_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
}
|
||||
UNREACHABLE
|
||||
}
|
||||
|
||||
static PieGeneration arch_os_pie_default(ArchType arch, OsType os, EnvironmentType env)
|
||||
{
|
||||
switch (os)
|
||||
{
|
||||
case OS_TYPE_UNKNOWN:
|
||||
return PIE_NONE;
|
||||
case OS_TYPE_OPENBSD:
|
||||
return PIE_SMALL;
|
||||
case OS_TYPE_WIN32:
|
||||
case OS_DARWIN_TYPES:
|
||||
case OS_TYPE_WASI:
|
||||
case OS_TYPE_FREE_BSD:
|
||||
case OS_TYPE_NETBSD:
|
||||
return PIE_SMALL;
|
||||
case OS_TYPE_LINUX:
|
||||
return env == ENV_TYPE_MUSLEABI || env == ENV_TYPE_MUSLEABIHF || env == ENV_TYPE_ANDROID ? PIE_SMALL : PIE_NONE;
|
||||
case OS_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
}
|
||||
UNREACHABLE
|
||||
}
|
||||
@@ -1171,47 +1020,18 @@ static unsigned os_target_pref_alignment_of_float(OsType os, ArchType arch, int
|
||||
switch (arch)
|
||||
{
|
||||
case ARCH_TYPE_UNKNOWN:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
case ARCH_TYPE_X86:
|
||||
if (os == OS_TYPE_ELFIAMCU && bits >= 32) return 4;
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_AARCH64:
|
||||
case ARCH_TYPE_AARCH64_BE:
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_PPC64:
|
||||
case ARCH_TYPE_PPC64LE:
|
||||
case ARCH_TYPE_PPC:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_RISCV32:
|
||||
case ARCH_TYPE_RISCV64:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_WASM32:
|
||||
case ARCH_TYPE_WASM64:
|
||||
case ARCH_TYPE_ARM:
|
||||
@@ -1219,18 +1039,9 @@ static unsigned os_target_pref_alignment_of_float(OsType os, ArchType arch, int
|
||||
case ARCH_TYPE_THUMBEB:
|
||||
case ARCH_TYPE_ARMB:
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_MSP430:
|
||||
return bits < 128 ? 2 : 16;
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
return bits < 64 ? bits / 8 : 8;
|
||||
case ARCH_TYPE_X86_64:
|
||||
if (bits == 128 && os == OS_TYPE_ELFIAMCU) return 4;
|
||||
return bits / 8;
|
||||
case ARCH_TYPE_XCORE:
|
||||
if (bits == 64) return 4;
|
||||
return bits / 8;
|
||||
}
|
||||
UNREACHABLE
|
||||
}
|
||||
@@ -1290,13 +1101,30 @@ void target_setup(BuildTarget *target)
|
||||
default:
|
||||
UNREACHABLE;
|
||||
}
|
||||
if (target->pic == PIC_BIG || target->pic == PIC_SMALL || (target->type != TARGET_TYPE_EXECUTABLE && target->type != TARGET_TYPE_TEST))
|
||||
|
||||
// Override PIE if needed.
|
||||
if (target->pie != PIE_DEFAULT) platform_target.pie = target->pie;
|
||||
// Override PIC, but only if the platform does not require PIC
|
||||
if (target->pic != PIC_DEFAULT && (target->pic != PIC_NONE || !platform_target.pic_required))
|
||||
{
|
||||
reloc_mode = LLVMRelocPIC;
|
||||
platform_target.pic = target->pic;
|
||||
}
|
||||
if (target->pic == PIC_NONE)
|
||||
|
||||
assert(platform_target.pic != PIC_DEFAULT && platform_target.pie != PIE_DEFAULT && "PIC and PIE must have been set.");
|
||||
|
||||
reloc_mode = LLVMRelocDefault;
|
||||
if (target->type != TARGET_TYPE_EXECUTABLE && target->type != TARGET_TYPE_TEST)
|
||||
{
|
||||
reloc_mode = LLVMRelocStatic;
|
||||
if (platform_target.pic == PIC_BIG || platform_target.pic == PIC_SMALL)
|
||||
{
|
||||
reloc_mode = LLVMRelocPIC;
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(platform_target.pic == PIC_NONE);
|
||||
reloc_mode = LLVMRelocStatic;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1383,41 +1211,7 @@ void target_setup(BuildTarget *target)
|
||||
*/
|
||||
switch (platform_target.arch)
|
||||
{
|
||||
case ARCH_TYPE_AARCH64_32:
|
||||
case ARCH_TYPE_BPFEL:
|
||||
case ARCH_TYPE_BPFEB:
|
||||
case ARCH_TYPE_SPARCEL:
|
||||
case ARCH_TYPE_LE64:
|
||||
case ARCH_TYPE_AMDIL:
|
||||
case ARCH_TYPE_AMDIL64:
|
||||
case ARCH_TYPE_HSAIL:
|
||||
case ARCH_TYPE_HSAIL64:
|
||||
case ARCH_TYPE_KALIMBA:
|
||||
case ARCH_TYPE_SHAVE:
|
||||
case ARCH_TYPE_RSCRIPT32:
|
||||
case ARCH_TYPE_RSCRIPT64:
|
||||
case ARCH_TYPE_LE32:
|
||||
case ARCH_TYPE_MIPS:
|
||||
case ARCH_TYPE_MIPSEL:
|
||||
case ARCH_TYPE_MIPS64EL:
|
||||
case ARCH_TYPE_MIPS64:
|
||||
case ARCH_TYPE_AVR:
|
||||
case ARCH_TYPE_NVPTX64:
|
||||
case ARCH_TYPE_NVPTX:
|
||||
case ARCH_TYPE_MSP430:
|
||||
case ARCH_TYPE_SYSTEMZ:
|
||||
case ARCH_TYPE_TCELE:
|
||||
case ARCH_TYPE_TCE:
|
||||
case ARCH_TYPE_LANAI:
|
||||
case ARCH_TYPE_HEXAGON:
|
||||
case ARCH_TYPE_AMDGCN:
|
||||
case ARCH_TYPE_R600:
|
||||
case ARCH_TYPE_SPARC:
|
||||
case ARCH_TYPE_SPARCV9:
|
||||
case ARCH_TYPE_XCORE:
|
||||
case ARCH_TYPE_ARC:
|
||||
case ARCH_TYPE_SPIR64:
|
||||
case ARCH_TYPE_SPIR:
|
||||
case ARCH_UNSUPPORTED:
|
||||
UNREACHABLE
|
||||
break;
|
||||
case ARCH_TYPE_AARCH64:
|
||||
@@ -1479,6 +1273,11 @@ void target_setup(BuildTarget *target)
|
||||
platform_target.abi = ABI_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
// TODO remove
|
||||
|
||||
platform_target.pic = arch_os_pic_default(platform_target.arch, platform_target.os);
|
||||
platform_target.pie = arch_os_pie_default(platform_target.arch, platform_target.os, platform_target.environment_type);
|
||||
platform_target.pic_required = arch_os_pic_default_forced(platform_target.arch, platform_target.os);
|
||||
|
||||
// TODO remove
|
||||
builtin_setup(&platform_target);
|
||||
}
|
||||
|
||||
@@ -63,6 +63,15 @@ typedef enum
|
||||
|
||||
} ArchType;
|
||||
|
||||
#define ARCH_UNSUPPORTED ARCH_TYPE_AARCH64_32: case ARCH_TYPE_BPFEL: case ARCH_TYPE_BPFEB: case ARCH_TYPE_SPARCEL: \
|
||||
case ARCH_TYPE_LE64: case ARCH_TYPE_AMDIL: case ARCH_TYPE_AMDIL64: case ARCH_TYPE_HSAIL: case ARCH_TYPE_HSAIL64: \
|
||||
case ARCH_TYPE_KALIMBA: case ARCH_TYPE_SHAVE: case ARCH_TYPE_RSCRIPT32: case ARCH_TYPE_RSCRIPT64: \
|
||||
case ARCH_TYPE_LE32: case ARCH_TYPE_MIPS: case ARCH_TYPE_MIPSEL: case ARCH_TYPE_MIPS64EL: case ARCH_TYPE_MIPS64: \
|
||||
case ARCH_TYPE_AVR: case ARCH_TYPE_NVPTX64: case ARCH_TYPE_NVPTX: case ARCH_TYPE_MSP430: case ARCH_TYPE_SYSTEMZ: \
|
||||
case ARCH_TYPE_TCELE: case ARCH_TYPE_TCE: case ARCH_TYPE_LANAI: case ARCH_TYPE_HEXAGON: case ARCH_TYPE_AMDGCN: \
|
||||
case ARCH_TYPE_R600: case ARCH_TYPE_SPARC: case ARCH_TYPE_SPARCV9: case ARCH_TYPE_XCORE: case ARCH_TYPE_ARC: \
|
||||
case ARCH_TYPE_SPIR64: case ARCH_TYPE_SPIR
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CTYPE_SHORT,
|
||||
@@ -111,6 +120,13 @@ typedef enum
|
||||
OS_TYPE_LAST = OS_TYPE_EMSCRIPTEN
|
||||
} OsType;
|
||||
|
||||
#define OS_DARWIN_TYPES OS_TYPE_WATCHOS: case OS_TYPE_IOS: case OS_TYPE_TVOS: case OS_TYPE_MACOSX
|
||||
#define OS_UNSUPPORTED OS_TYPE_AIX: case OS_TYPE_HAIKU: case OS_TYPE_ANANAS: case OS_TYPE_CLOUD_ABI: \
|
||||
case OS_TYPE_DRAGON_FLY: case OS_TYPE_FUCHSIA: case OS_TYPE_KFREEBSD: case OS_TYPE_PS3: case OS_TYPE_RTEMS: \
|
||||
case OS_TYPE_SOLARIS: case OS_TYPE_MINIX: case OS_TYPE_NACL: case OS_TYPE_CNK: case OS_TYPE_CUDA: \
|
||||
case OS_TYPE_NVOPENCL: case OS_TYPE_AMDHSA: case OS_TYPE_PS4: case OS_TYPE_ELFIAMCU: case OS_TYPE_MESA3D: \
|
||||
case OS_TYPE_CONTIKI: case OS_TYPE_AMDPAL: case OS_TYPE_HERMITCORE: case OS_TYPE_HURD: case OS_TYPE_EMSCRIPTEN
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ENV_TYPE_UNKNOWN,
|
||||
@@ -230,6 +246,9 @@ typedef struct
|
||||
ObjectFormatType object_format;
|
||||
int alloca_address_space;
|
||||
ABI abi;
|
||||
PicGeneration pic : 3;
|
||||
PieGeneration pie : 3;
|
||||
bool pic_required : 1;
|
||||
FloatABI float_abi : 3;
|
||||
unsigned default_number_regs : 8;
|
||||
union
|
||||
|
||||
Reference in New Issue
Block a user