2016-02-11 06:41:50 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016 Andrew Kelley
|
|
|
|
*
|
|
|
|
* This file is part of zig, which is MIT licensed.
|
|
|
|
* See http://opensource.org/licenses/MIT
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ZIG_TARGET_HPP
|
|
|
|
#define ZIG_TARGET_HPP
|
|
|
|
|
2017-12-27 08:44:08 +08:00
|
|
|
#include <zig_llvm.h>
|
2016-02-11 06:41:50 +08:00
|
|
|
|
2016-02-11 16:33:27 +08:00
|
|
|
struct Buf;
|
|
|
|
|
2018-03-23 03:32:47 +08:00
|
|
|
// Synchronize with target.cpp::os_list
|
2018-01-07 12:10:53 +08:00
|
|
|
enum Os {
|
|
|
|
OsFreestanding,
|
|
|
|
OsAnanas,
|
|
|
|
OsCloudABI,
|
|
|
|
OsDragonFly,
|
|
|
|
OsFreeBSD,
|
|
|
|
OsFuchsia,
|
|
|
|
OsIOS,
|
|
|
|
OsKFreeBSD,
|
|
|
|
OsLinux,
|
|
|
|
OsLv2, // PS3
|
|
|
|
OsMacOSX,
|
|
|
|
OsNetBSD,
|
|
|
|
OsOpenBSD,
|
|
|
|
OsSolaris,
|
|
|
|
OsWindows,
|
|
|
|
OsHaiku,
|
|
|
|
OsMinix,
|
|
|
|
OsRTEMS,
|
|
|
|
OsNaCl, // Native Client
|
|
|
|
OsCNK, // BG/P Compute-Node Kernel
|
|
|
|
OsAIX,
|
|
|
|
OsCUDA, // NVIDIA CUDA
|
|
|
|
OsNVCL, // NVIDIA OpenCL
|
|
|
|
OsAMDHSA, // AMD HSA Runtime
|
|
|
|
OsPS4,
|
|
|
|
OsELFIAMCU,
|
|
|
|
OsTvOS, // Apple tvOS
|
|
|
|
OsWatchOS, // Apple watchOS
|
|
|
|
OsMesa3D,
|
|
|
|
OsContiki,
|
2018-03-23 03:32:47 +08:00
|
|
|
OsAMDPAL,
|
2018-01-07 12:10:53 +08:00
|
|
|
OsZen,
|
2018-12-24 11:44:02 +08:00
|
|
|
OsUefi,
|
2018-01-07 12:10:53 +08:00
|
|
|
};
|
|
|
|
|
2019-02-27 04:51:32 +08:00
|
|
|
// Synchronize with target.cpp::subarch_list_list
|
|
|
|
enum SubArchList {
|
|
|
|
SubArchListNone,
|
|
|
|
SubArchListArm32,
|
|
|
|
SubArchListArm64,
|
|
|
|
SubArchListKalimba,
|
|
|
|
};
|
|
|
|
|
2018-12-27 04:25:54 +08:00
|
|
|
enum TargetSubsystem {
|
|
|
|
TargetSubsystemAuto, // Zig should infer the subsystem
|
|
|
|
TargetSubsystemConsole,
|
|
|
|
TargetSubsystemWindows,
|
|
|
|
TargetSubsystemPosix,
|
|
|
|
TargetSubsystemNative,
|
|
|
|
TargetSubsystemEfiApplication,
|
|
|
|
TargetSubsystemEfiBootServiceDriver,
|
|
|
|
TargetSubsystemEfiRom,
|
|
|
|
TargetSubsystemEfiRuntimeDriver,
|
|
|
|
};
|
|
|
|
|
2016-02-11 16:33:27 +08:00
|
|
|
struct ZigTarget {
|
2019-02-27 04:51:32 +08:00
|
|
|
ZigLLVM_ArchType arch;
|
|
|
|
ZigLLVM_SubArchType sub_arch;
|
2016-02-11 16:33:27 +08:00
|
|
|
ZigLLVM_VendorType vendor;
|
2018-01-07 12:10:53 +08:00
|
|
|
Os os;
|
2019-02-27 04:51:32 +08:00
|
|
|
ZigLLVM_EnvironmentType abi;
|
2019-02-23 22:35:56 +08:00
|
|
|
bool is_native;
|
2016-02-11 16:33:27 +08:00
|
|
|
};
|
|
|
|
|
2016-02-13 03:07:11 +08:00
|
|
|
enum CIntType {
|
|
|
|
CIntTypeShort,
|
|
|
|
CIntTypeUShort,
|
|
|
|
CIntTypeInt,
|
|
|
|
CIntTypeUInt,
|
|
|
|
CIntTypeLong,
|
|
|
|
CIntTypeULong,
|
|
|
|
CIntTypeLongLong,
|
|
|
|
CIntTypeULongLong,
|
|
|
|
|
|
|
|
CIntTypeCount,
|
|
|
|
};
|
|
|
|
|
2019-02-27 04:51:32 +08:00
|
|
|
Error target_parse_triple(ZigTarget *target, const char *triple);
|
|
|
|
Error target_parse_archsub(ZigLLVM_ArchType *arch, ZigLLVM_SubArchType *sub,
|
|
|
|
const char *archsub_ptr, size_t archsub_len);
|
|
|
|
Error target_parse_os(Os *os, const char *os_ptr, size_t os_len);
|
|
|
|
Error target_parse_abi(ZigLLVM_EnvironmentType *abi, const char *abi_ptr, size_t abi_len);
|
|
|
|
|
2016-09-16 02:05:15 +08:00
|
|
|
size_t target_arch_count(void);
|
2019-02-27 04:51:32 +08:00
|
|
|
ZigLLVM_ArchType target_arch_enum(size_t index);
|
|
|
|
const char *target_arch_name(ZigLLVM_ArchType arch);
|
|
|
|
|
|
|
|
SubArchList target_subarch_list(ZigLLVM_ArchType arch);
|
|
|
|
size_t target_subarch_count(SubArchList sub_arch_list);
|
|
|
|
ZigLLVM_SubArchType target_subarch_enum(SubArchList subarch_list, size_t index);
|
|
|
|
const char *target_subarch_name(ZigLLVM_SubArchType subarch);
|
2016-02-11 06:41:50 +08:00
|
|
|
|
2019-02-27 04:51:32 +08:00
|
|
|
size_t target_subarch_list_count(void);
|
|
|
|
SubArchList target_subarch_list_enum(size_t index);
|
|
|
|
const char *target_subarch_list_name(SubArchList sub_arch_list);
|
|
|
|
|
|
|
|
const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch);
|
2018-05-13 05:35:15 +08:00
|
|
|
|
2016-09-16 02:05:15 +08:00
|
|
|
size_t target_vendor_count(void);
|
2019-02-27 04:51:32 +08:00
|
|
|
ZigLLVM_VendorType target_vendor_enum(size_t index);
|
2016-02-11 06:41:50 +08:00
|
|
|
|
2016-09-16 02:05:15 +08:00
|
|
|
size_t target_os_count(void);
|
2019-02-27 04:51:32 +08:00
|
|
|
Os target_os_enum(size_t index);
|
|
|
|
const char *target_os_name(Os os_type);
|
2016-02-11 06:41:50 +08:00
|
|
|
|
2019-02-27 04:51:32 +08:00
|
|
|
size_t target_abi_count(void);
|
|
|
|
ZigLLVM_EnvironmentType target_abi_enum(size_t index);
|
|
|
|
const char *target_abi_name(ZigLLVM_EnvironmentType abi);
|
|
|
|
ZigLLVM_EnvironmentType target_default_abi(ZigLLVM_ArchType arch, Os os);
|
2016-02-11 06:41:50 +08:00
|
|
|
|
2016-08-18 11:11:04 +08:00
|
|
|
|
2016-09-16 02:05:15 +08:00
|
|
|
size_t target_oformat_count(void);
|
2019-02-27 04:51:32 +08:00
|
|
|
ZigLLVM_ObjectFormatType target_oformat_enum(size_t index);
|
|
|
|
const char *target_oformat_name(ZigLLVM_ObjectFormatType oformat);
|
2019-02-23 22:35:56 +08:00
|
|
|
ZigLLVM_ObjectFormatType target_object_format(const ZigTarget *target);
|
2016-08-18 11:11:04 +08:00
|
|
|
|
2016-02-11 16:33:27 +08:00
|
|
|
void get_native_target(ZigTarget *target);
|
2019-02-27 04:51:32 +08:00
|
|
|
void get_target_triple(Buf *triple, const ZigTarget *target);
|
2016-02-11 16:33:27 +08:00
|
|
|
|
|
|
|
void init_all_targets(void);
|
|
|
|
|
|
|
|
void resolve_target_object_format(ZigTarget *target);
|
|
|
|
|
2017-04-11 08:02:39 +08:00
|
|
|
uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id);
|
2016-02-11 16:33:27 +08:00
|
|
|
|
2019-02-23 22:35:56 +08:00
|
|
|
const char *target_o_file_ext(const ZigTarget *target);
|
|
|
|
const char *target_asm_file_ext(const ZigTarget *target);
|
|
|
|
const char *target_llvm_ir_file_ext(const ZigTarget *target);
|
|
|
|
const char *target_exe_file_ext(const ZigTarget *target);
|
2019-03-06 07:17:22 +08:00
|
|
|
const char *target_lib_file_prefix(const ZigTarget *target);
|
2019-02-23 22:35:56 +08:00
|
|
|
const char *target_lib_file_ext(const ZigTarget *target, bool is_static,
|
|
|
|
size_t version_major, size_t version_minor, size_t version_patch);
|
2017-04-05 19:46:50 +08:00
|
|
|
|
2019-02-27 04:51:32 +08:00
|
|
|
const char *target_dynamic_linker(const ZigTarget *target);
|
2017-04-13 13:15:25 +08:00
|
|
|
|
2017-10-01 02:40:16 +08:00
|
|
|
bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);
|
2018-10-09 01:24:39 +08:00
|
|
|
ZigLLVM_OSType get_llvm_os_type(Os os_type);
|
2017-04-13 13:15:25 +08:00
|
|
|
|
2018-11-18 00:19:46 +08:00
|
|
|
bool target_is_arm(const ZigTarget *target);
|
2019-02-15 05:10:12 +08:00
|
|
|
bool target_allows_addr_zero(const ZigTarget *target);
|
2019-02-20 01:07:56 +08:00
|
|
|
bool target_has_valgrind_support(const ZigTarget *target);
|
2019-03-14 07:33:19 +08:00
|
|
|
bool target_os_is_darwin(Os os);
|
|
|
|
bool target_os_requires_libc(Os os);
|
2019-03-13 01:18:52 +08:00
|
|
|
bool target_can_build_libc(const ZigTarget *target);
|
|
|
|
const char *target_libc_generic_name(const ZigTarget *target);
|
2019-03-14 07:33:19 +08:00
|
|
|
bool target_is_libc_lib_name(const ZigTarget *target, const char *name);
|
2019-02-26 02:34:25 +08:00
|
|
|
bool target_supports_fpic(const ZigTarget *target);
|
2019-03-14 07:33:19 +08:00
|
|
|
bool target_requires_pic(const ZigTarget *target);
|
2019-03-05 11:15:53 +08:00
|
|
|
bool target_abi_is_gnu(ZigLLVM_EnvironmentType abi);
|
2019-03-13 01:18:52 +08:00
|
|
|
bool target_abi_is_musl(ZigLLVM_EnvironmentType abi);
|
2019-03-14 07:33:19 +08:00
|
|
|
bool target_is_glibc(const ZigTarget *target);
|
|
|
|
bool target_is_musl(const ZigTarget *target);
|
2018-11-18 00:19:46 +08:00
|
|
|
|
2019-03-07 01:10:03 +08:00
|
|
|
uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch);
|
|
|
|
|
2016-02-11 06:41:50 +08:00
|
|
|
#endif
|