Browse Source

Allow `@(rodata)` on `@(static)` variables

gingerBill 1 year ago
parent
commit
bea47db495
2 changed files with 8 additions and 2 deletions
  1. 5 1
      src/check_stmt.cpp
  2. 3 1
      src/llvm_backend_stmt.cpp

+ 5 - 1
src/check_stmt.cpp

@@ -2059,7 +2059,11 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f
 			}
 		}
 		if (ac.rodata) {
-			error(e->token, "Only global variables can have @(rodata) applied");
+			if (ac.is_static) {
+				e->Variable.is_rodata = true;
+			} else {
+				error(e->token, "Only global or @(static) variables can have @(rodata) applied");
+			}
 		}
 		if (ac.thread_local_model != "") {
 			String name = e->token.string;

+ 3 - 1
src/llvm_backend_stmt.cpp

@@ -1850,7 +1850,9 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) {
 		LLVMSetInitializer(global, LLVMConstNull(lb_type(p->module, e->type)));
 		if (value.value != nullptr) {
 			LLVMSetInitializer(global, value.value);
-		} else {
+		}
+		if (e->Variable.is_rodata) {
+			LLVMSetGlobalConstant(global, true);
 		}
 		if (e->Variable.thread_local_model != "") {
 			LLVMSetThreadLocal(global, true);