Browse Source

`-target-features:<string>`

This just passes a string directly to the LLVM features string
gingerBill 3 years ago
parent
commit
09e4fff5b1
4 changed files with 14 additions and 9 deletions
  1. 1 0
      src/build_settings.cpp
  2. 4 0
      src/llvm_backend.cpp
  3. 9 1
      src/main.cpp
  4. 0 8
      src/string.cpp

+ 1 - 0
src/build_settings.cpp

@@ -232,6 +232,7 @@ struct BuildContext {
 	String extra_linker_flags;
 	String extra_linker_flags;
 	String extra_assembler_flags;
 	String extra_assembler_flags;
 	String microarch;
 	String microarch;
+	String target_features;
 	BuildModeKind build_mode;
 	BuildModeKind build_mode;
 	bool   generate_docs;
 	bool   generate_docs;
 	i32    optimization_level;
 	i32    optimization_level;

+ 4 - 0
src/llvm_backend.cpp

@@ -1298,6 +1298,10 @@ void lb_generate_code(lbGenerator *gen) {
 		}
 		}
 	}
 	}
 
 
+	if (build_context.target_features.len != 0) {
+		llvm_features = alloc_cstring(permanent_allocator(), build_context.target_features);
+	}
+
 	// GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target));
 	// GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target));
 
 
 	LLVMCodeGenOptLevel code_gen_level = LLVMCodeGenLevelNone;
 	LLVMCodeGenOptLevel code_gen_level = LLVMCodeGenLevelNone;

+ 9 - 1
src/main.cpp

@@ -626,6 +626,7 @@ enum BuildFlagKind {
 	BuildFlag_ExtraLinkerFlags,
 	BuildFlag_ExtraLinkerFlags,
 	BuildFlag_ExtraAssemblerFlags,
 	BuildFlag_ExtraAssemblerFlags,
 	BuildFlag_Microarch,
 	BuildFlag_Microarch,
+	BuildFlag_TargetFeatures,
 
 
 	BuildFlag_RelocMode,
 	BuildFlag_RelocMode,
 	BuildFlag_DisableRedZone,
 	BuildFlag_DisableRedZone,
@@ -783,7 +784,8 @@ bool parse_build_flags(Array<String> args) {
 	add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None, Command__does_check);
 	add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None, Command__does_check);
 	add_flag(&build_flags, BuildFlag_ExtraLinkerFlags,    str_lit("extra-linker-flags"),            BuildFlagParam_String, Command__does_build);
 	add_flag(&build_flags, BuildFlag_ExtraLinkerFlags,    str_lit("extra-linker-flags"),            BuildFlagParam_String, Command__does_build);
 	add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"),         BuildFlagParam_String, Command__does_build);
 	add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"),         BuildFlagParam_String, Command__does_build);
-	add_flag(&build_flags, BuildFlag_Microarch,         str_lit("microarch"),                       BuildFlagParam_String, Command__does_build);
+	add_flag(&build_flags, BuildFlag_Microarch,           str_lit("microarch"),                       BuildFlagParam_String, Command__does_build);
+	add_flag(&build_flags, BuildFlag_TargetFeatures,      str_lit("target-features"),                 BuildFlagParam_String, Command__does_build);
 
 
 	add_flag(&build_flags, BuildFlag_RelocMode,        str_lit("reloc-mode"),                       BuildFlagParam_String, Command__does_build);
 	add_flag(&build_flags, BuildFlag_RelocMode,        str_lit("reloc-mode"),                       BuildFlagParam_String, Command__does_build);
 	add_flag(&build_flags, BuildFlag_DisableRedZone,   str_lit("disable-red-zone"),                 BuildFlagParam_None, Command__does_build);
 	add_flag(&build_flags, BuildFlag_DisableRedZone,   str_lit("disable-red-zone"),                 BuildFlagParam_None, Command__does_build);
@@ -1351,6 +1353,12 @@ bool parse_build_flags(Array<String> args) {
 							string_to_lower(&build_context.microarch);
 							string_to_lower(&build_context.microarch);
 							break;
 							break;
 						}
 						}
+						case BuildFlag_TargetFeatures: {
+							GB_ASSERT(value.kind == ExactValue_String);
+							build_context.target_features = value.value_string;
+							string_to_lower(&build_context.target_features);
+							break;
+						}
 						case BuildFlag_RelocMode: {
 						case BuildFlag_RelocMode: {
 							GB_ASSERT(value.kind == ExactValue_String);
 							GB_ASSERT(value.kind == ExactValue_String);
 							String v = value.value_string;
 							String v = value.value_string;

+ 0 - 8
src/string.cpp

@@ -10,10 +10,6 @@ struct String {
 	u8 *  text;
 	u8 *  text;
 	isize len;
 	isize len;
 
 
-	// u8 &operator[](isize i) {
-	// 	GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
-	// 	return text[i];
-	// }
 	u8 const &operator[](isize i) const {
 	u8 const &operator[](isize i) const {
 		GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
 		GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
 		return text[i];
 		return text[i];
@@ -33,10 +29,6 @@ struct String {
 struct String16 {
 struct String16 {
 	wchar_t *text;
 	wchar_t *text;
 	isize    len;
 	isize    len;
-	wchar_t &operator[](isize i) {
-		GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
-		return text[i];
-	}
 	wchar_t const &operator[](isize i) const {
 	wchar_t const &operator[](isize i) const {
 		GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
 		GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i);
 		return text[i];
 		return text[i];