Browse Source

Add `freestanding_amd64_gnu`

gingerBill 3 years ago
parent
commit
1bec9e5331
3 changed files with 48 additions and 5 deletions
  1. 32 4
      src/build_settings.cpp
  2. 3 1
      src/llvm_abi.cpp
  3. 13 0
      src/llvm_backend.cpp

+ 32 - 4
src/build_settings.cpp

@@ -8,7 +8,7 @@
 // #define DEFAULT_TO_THREADED_CHECKER
 // #define DEFAULT_TO_THREADED_CHECKER
 // #endif
 // #endif
 
 
-enum TargetOsKind {
+enum TargetOsKind : u16 {
 	TargetOs_Invalid,
 	TargetOs_Invalid,
 
 
 	TargetOs_windows,
 	TargetOs_windows,
@@ -25,7 +25,7 @@ enum TargetOsKind {
 	TargetOs_COUNT,
 	TargetOs_COUNT,
 };
 };
 
 
-enum TargetArchKind {
+enum TargetArchKind : u16 {
 	TargetArch_Invalid,
 	TargetArch_Invalid,
 
 
 	TargetArch_amd64,
 	TargetArch_amd64,
@@ -37,7 +37,7 @@ enum TargetArchKind {
 	TargetArch_COUNT,
 	TargetArch_COUNT,
 };
 };
 
 
-enum TargetEndianKind {
+enum TargetEndianKind : u8 {
 	TargetEndian_Invalid,
 	TargetEndian_Invalid,
 
 
 	TargetEndian_Little,
 	TargetEndian_Little,
@@ -46,6 +46,16 @@ enum TargetEndianKind {
 	TargetEndian_COUNT,
 	TargetEndian_COUNT,
 };
 };
 
 
+enum TargetABIKind : u16 {
+	TargetABI_Default,
+
+	TargetABI_MSVC,
+	TargetABI_GNU,
+
+	TargetABI_COUNT,
+};
+
+
 String target_os_names[TargetOs_COUNT] = {
 String target_os_names[TargetOs_COUNT] = {
 	str_lit(""),
 	str_lit(""),
 	str_lit("windows"),
 	str_lit("windows"),
@@ -75,6 +85,12 @@ String target_endian_names[TargetEndian_COUNT] = {
 	str_lit("big"),
 	str_lit("big"),
 };
 };
 
 
+String target_abi_names[TargetABI_COUNT] = {
+	str_lit(""),
+	str_lit("win64"),
+	str_lit("sysv"),
+};
+
 TargetEndianKind target_endians[TargetArch_COUNT] = {
 TargetEndianKind target_endians[TargetArch_COUNT] = {
 	TargetEndian_Invalid,
 	TargetEndian_Invalid,
 	TargetEndian_Little,
 	TargetEndian_Little,
@@ -98,6 +114,7 @@ struct TargetMetrics {
 	isize          max_align;
 	isize          max_align;
 	String         target_triplet;
 	String         target_triplet;
 	String         target_data_layout;
 	String         target_data_layout;
+	TargetABIKind  abi;
 };
 };
 
 
 
 
@@ -399,6 +416,16 @@ gb_global TargetMetrics target_wasi_wasm32 = {
 // 	str_lit(""),
 // 	str_lit(""),
 // };
 // };
 
 
+gb_global TargetMetrics target_freestanding_amd64_gnu = {
+	TargetOs_freestanding,
+	TargetArch_amd64,
+	8,
+	16,
+	str_lit("x86_64-pc-none-gnu"),
+	str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
+	TargetABI_GNU,
+};
+
 
 
 
 
 struct NamedTargetMetrics {
 struct NamedTargetMetrics {
@@ -420,7 +447,8 @@ gb_global NamedTargetMetrics named_targets[] = {
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
 	{ str_lit("js_wasm32"),           &target_js_wasm32 },
 	{ str_lit("js_wasm32"),           &target_js_wasm32 },
-	// { str_lit("freestanding_wasm64"), &target_freestanding_wasm64 },
+
+	{ str_lit("freestanding_amd64_gnu"), &target_freestanding_amd64_gnu },
 };
 };
 
 
 NamedTargetMetrics *selected_target_metrics;
 NamedTargetMetrics *selected_target_metrics;

+ 3 - 1
src/llvm_abi.cpp

@@ -1194,8 +1194,10 @@ LB_ABI_INFO(lb_get_abi_info) {
 
 
 	switch (build_context.metrics.arch) {
 	switch (build_context.metrics.arch) {
 	case TargetArch_amd64:
 	case TargetArch_amd64:
-		if (build_context.metrics.os == TargetOs_windows) {
+		if (build_context.metrics.os == TargetOs_windows || build_context.metrics.abi == TargetABI_MSVC) {
 			return lbAbiAmd64Win64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention);
 			return lbAbiAmd64Win64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention);
+		} else if (build_context.metrics.abi == TargetABI_GNU) {
+			return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention);
 		} else {
 		} else {
 			return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention);
 			return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention);
 		}
 		}

+ 13 - 0
src/llvm_backend.cpp

@@ -996,6 +996,19 @@ String lb_filepath_obj_for_module(lbModule *m) {
 			case TargetOs_essence:
 			case TargetOs_essence:
 				ext = STR_LIT(".o");
 				ext = STR_LIT(".o");
 				break;
 				break;
+
+			case TargetOs_freestanding:
+				switch (build_context.metrics.abi) {
+				default:
+				case TargetABI_Default:
+				case TargetABI_GNU:
+					ext = STR_LIT(".o");
+					break;
+				case TargetABI_MSVC:
+					ext = STR_LIT(".obj");
+					break;
+				}
+				break;
 			}
 			}
 		}
 		}
 	}
 	}