aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHayden Gray <35206453+A1029384756@users.noreply.github.com>2025-06-26 16:43:44 -0400
committerGitHub <noreply@github.com>2025-06-26 22:43:44 +0200
commitf72b2b153057e1d629c85af2ea7c54f7928198d5 (patch)
treebe8f9648adf737cc7d9aadef48c3a03a17f7634c
parent22a48d4d9c626419f93212d317ba94d7608f02c3 (diff)
[source-code-locations] - added options to show, obfuscate, and hide source code locations (#5412)
-rw-r--r--src/build_settings.cpp9
-rw-r--r--src/check_expr.cpp46
-rw-r--r--src/llvm_backend_const.cpp20
-rw-r--r--src/llvm_backend_general.cpp14
-rw-r--r--src/main.cpp30
5 files changed, 107 insertions, 12 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 05709902a..ebe57bf1e 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -385,6 +385,13 @@ enum LinkerChoice : i32 {
Linker_COUNT,
};
+enum SourceCodeLocationInfo : u8 {
+ SourceCodeLocationInfo_Normal = 0,
+ SourceCodeLocationInfo_Obfuscated = 1,
+ SourceCodeLocationInfo_Filename = 2,
+ SourceCodeLocationInfo_None = 3,
+};
+
String linker_choices[Linker_COUNT] = {
str_lit("default"),
str_lit("lld"),
@@ -512,7 +519,7 @@ struct BuildContext {
bool dynamic_map_calls;
- bool obfuscate_source_code_locations;
+ SourceCodeLocationInfo source_code_location_info;
bool min_link_libs;
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 14d54af68..aa9c8837d 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -8760,23 +8760,52 @@ gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, A
String name = bd->name.string;
if (name == "file") {
String file = get_file_path_string(bd->token.pos.file_id);
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
file = obfuscate_string(file, "F");
+ break;
+ case SourceCodeLocationInfo_Filename:
+ file = last_path_element(file);
+ break;
+ case SourceCodeLocationInfo_None:
+ file = str_lit("");
+ break;
}
o->type = t_untyped_string;
o->value = exact_value_string(file);
} else if (name == "directory") {
String file = get_file_path_string(bd->token.pos.file_id);
String path = dir_from_path(file);
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
path = obfuscate_string(path, "D");
+ break;
+ case SourceCodeLocationInfo_Filename:
+ path = last_path_element(path);
+ break;
+ case SourceCodeLocationInfo_None:
+ path = str_lit("");
+ break;
}
o->type = t_untyped_string;
o->value = exact_value_string(path);
} else if (name == "line") {
i32 line = bd->token.pos.line;
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
line = obfuscate_i32(line);
+ break;
+ case SourceCodeLocationInfo_Filename:
+ break;
+ case SourceCodeLocationInfo_None:
+ line = 0;
+ break;
}
o->type = t_untyped_integer;
o->value = exact_value_i64(line);
@@ -8787,8 +8816,17 @@ gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, A
o->value = exact_value_string(str_lit(""));
} else {
String p = c->proc_name;
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
p = obfuscate_string(p, "P");
+ break;
+ case SourceCodeLocationInfo_Filename:
+ break;
+ case SourceCodeLocationInfo_None:
+ p = str_lit("");
+ break;
}
o->type = t_untyped_string;
o->value = exact_value_string(p);
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp
index e897ae282..c3112934e 100644
--- a/src/llvm_backend_const.cpp
+++ b/src/llvm_backend_const.cpp
@@ -292,12 +292,26 @@ gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String cons
i32 line = pos.line;
i32 column = pos.column;
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
file = obfuscate_string(file, "F");
procedure = obfuscate_string(procedure, "P");
- line = obfuscate_i32(line);
- column = obfuscate_i32(column);
+ line = obfuscate_i32(line);
+ column = obfuscate_i32(column);
+ break;
+ case SourceCodeLocationInfo_Filename:
+ file = last_path_element(file);
+ break;
+ case SourceCodeLocationInfo_None:
+ file = str_lit("");
+ procedure = str_lit("");
+
+ line = 0;
+ column = 0;
+ break;
}
LLVMValueRef fields[4] = {};
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 5d6a55973..aaa9ffd4d 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -568,10 +568,22 @@ gb_internal void lb_set_file_line_col(lbProcedure *p, Array<lbValue> arr, TokenP
i32 line = pos.line;
i32 col = pos.column;
- if (build_context.obfuscate_source_code_locations) {
+ switch (build_context.source_code_location_info) {
+ case SourceCodeLocationInfo_Normal:
+ break;
+ case SourceCodeLocationInfo_Obfuscated:
file = obfuscate_string(file, "F");
line = obfuscate_i32(line);
col = obfuscate_i32(col);
+ break;
+ case SourceCodeLocationInfo_Filename:
+ file = last_path_element(file);
+ break;
+ case SourceCodeLocationInfo_None:
+ file = str_lit("");
+ line = 0;
+ col = 0;
+ break;
}
arr[0] = lb_find_or_add_entity_string(p->module, file, false);
diff --git a/src/main.cpp b/src/main.cpp
index d7fb66f99..f988aff6a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -370,6 +370,7 @@ enum BuildFlagKind {
BuildFlag_NoRTTI,
BuildFlag_DynamicMapCalls,
BuildFlag_ObfuscateSourceCodeLocations,
+ BuildFlag_SourceCodeLocations,
BuildFlag_Compact,
BuildFlag_GlobalDefinitions,
@@ -594,6 +595,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_DynamicMapCalls, str_lit("dynamic-map-calls"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_ObfuscateSourceCodeLocations, str_lit("obfuscate-source-code-locations"), BuildFlagParam_None, Command__does_build);
+ add_flag(&build_flags, BuildFlag_SourceCodeLocations, str_lit("source-code-locations"), BuildFlagParam_String, Command__does_build);
add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc);
add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc | Command_test | Command_build);
@@ -1422,7 +1424,23 @@ gb_internal bool parse_build_flags(Array<String> args) {
break;
case BuildFlag_ObfuscateSourceCodeLocations:
- build_context.obfuscate_source_code_locations = true;
+ gb_printf_err("'-obfuscate-source-code-locations' is now deprecated in favor of '-source-code-locations:obfuscated'\n");
+ build_context.source_code_location_info = SourceCodeLocationInfo_Obfuscated;
+ break;
+
+ case BuildFlag_SourceCodeLocations:
+ if (str_eq_ignore_case(value.value_string, str_lit("normal"))) {
+ build_context.source_code_location_info = SourceCodeLocationInfo_Normal;
+ } else if (str_eq_ignore_case(value.value_string, str_lit("obfuscated"))) {
+ build_context.source_code_location_info = SourceCodeLocationInfo_Obfuscated;
+ } else if (str_eq_ignore_case(value.value_string, str_lit("filename"))) {
+ build_context.source_code_location_info = SourceCodeLocationInfo_Filename;
+ } else if (str_eq_ignore_case(value.value_string, str_lit("none"))) {
+ build_context.source_code_location_info = SourceCodeLocationInfo_None;
+ } else {
+ gb_printf_err("-source-code-locations:<string> options are 'normal', 'obfuscated', 'filename', and 'none'\n");
+ bad_flags = true;
+ }
break;
case BuildFlag_DefaultToNilAllocator:
@@ -2669,8 +2687,14 @@ gb_internal int print_show_help(String const arg0, String command, String option
}
- if (print_flag("-obfuscate-source-code-locations")) {
- print_usage_line(2, "Obfuscate the file and procedure strings, and line and column numbers, stored with a 'runtime.Source_Code_Location' value.");
+ if (print_flag("-source-code-locations:<string>")) {
+ print_usage_line(2, "Processes the file and procedure strings, and line and column numbers, stored with a 'runtime.Source_Code_Location' value.");
+ print_usage_line(2, "Available options:");
+ print_usage_line(3, "-source-code-locations:normal");
+ print_usage_line(3, "-source-code-locations:obfuscated");
+ print_usage_line(3, "-source-code-locations:filename");
+ print_usage_line(3, "-source-code-locations:none");
+ print_usage_line(2, "The default is -source-code-locations:normal.");
}