aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/check_expr.cpp18
-rw-r--r--src/common.cpp21
-rw-r--r--src/llvm_backend_const.cpp26
3 files changed, 40 insertions, 25 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index fe8c9599f..b893b3a00 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -8157,19 +8157,31 @@ gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, A
o->mode = Addressing_Constant;
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) {
+ file = obfuscate_string(file, "F");
+ }
o->type = t_untyped_string;
- o->value = exact_value_string(get_file_path_string(bd->token.pos.file_id));
+ o->value = exact_value_string(file);
} else if (name == "line") {
+ i32 line = bd->token.pos.line;
+ if (build_context.obfuscate_source_code_locations) {
+ line = obfuscate_i32(line);
+ }
o->type = t_untyped_integer;
- o->value = exact_value_i64(bd->token.pos.line);
+ o->value = exact_value_i64(line);
} else if (name == "procedure") {
if (c->curr_proc_decl == nullptr) {
error(node, "#procedure may only be used within procedures");
o->type = t_untyped_string;
o->value = exact_value_string(str_lit(""));
} else {
+ String p = c->proc_name;
+ if (build_context.obfuscate_source_code_locations) {
+ p = obfuscate_string(p, "P");
+ }
o->type = t_untyped_string;
- o->value = exact_value_string(c->proc_name);
+ o->value = exact_value_string(p);
}
} else if (name == "caller_location") {
init_core_source_code_location(c->checker);
diff --git a/src/common.cpp b/src/common.cpp
index aad420325..69426e2a6 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -353,6 +353,27 @@ gb_global bool global_module_path_set = false;
#include "thread_pool.cpp"
+gb_internal String obfuscate_string(String const &s, char const *prefix) {
+ if (s.len == 0) {
+ return s;
+ }
+ GB_ASSERT(prefix != nullptr);
+ u64 hash = gb_fnv64a(s.text, s.len);
+ gbString res = gb_string_make(permanent_allocator(), prefix);
+ res = gb_string_append_fmt(res, "x%llx", cast(long long unsigned)hash);
+ return make_string_c(res);
+}
+
+gb_internal i32 obfuscate_i32(i32 i) {
+ i32 x = cast(i32)gb_fnv64a(&i, sizeof(i));
+ if (x < 0) {
+ x = 1-x;
+ }
+ return cast(i32)x;
+}
+
+
+
struct StringIntern {
StringIntern *next;
isize len;
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp
index 1ca5f4965..8035336d3 100644
--- a/src/llvm_backend_const.cpp
+++ b/src/llvm_backend_const.cpp
@@ -287,24 +287,6 @@ gb_internal lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type
return lb_const_value(m, t, tv.value);
}
-gb_internal String lb_obfuscate_string(String const &s, char const *prefix) {
- if (s.len == 0) {
- return {};
- }
- GB_ASSERT(prefix != nullptr);
- u64 hash = gb_fnv64a(s.text, s.len);
- gbString res = gb_string_make(temporary_allocator(), prefix);
- res = gb_string_append_fmt(res, "x%llx", cast(long long unsigned)hash);
- return make_string_c(res);
-}
-
-gb_internal i32 lb_obfuscate_i32(i32 i) {
- i32 x = cast(i32)gb_fnv64a(&i, sizeof(i));
- if (x < 0) {
- x = 1-x;
- }
- return cast(i32)x;
-}
gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure_, TokenPos const &pos) {
String file = get_file_path_string(pos.file_id);
@@ -314,11 +296,11 @@ gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String cons
i32 column = pos.column;
if (build_context.obfuscate_source_code_locations) {
- file = lb_obfuscate_string(file, "F");
- procedure = lb_obfuscate_string(procedure, "P");
+ file = obfuscate_string(file, "F");
+ procedure = obfuscate_string(procedure, "P");
- line = lb_obfuscate_i32(line);
- column = lb_obfuscate_i32(column);
+ line = obfuscate_i32(line);
+ column = obfuscate_i32(column);
}
LLVMValueRef fields[4] = {};