diff options
| author | gingerBill <bill@gingerbill.org> | 2024-06-06 15:20:47 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2024-06-06 15:20:47 +0100 |
| commit | bea47db4953559dbbcdce1da5dbaf38d0bb8d943 (patch) | |
| tree | ded35c03f4e5bb20c3f602740ea8dd3a1dfab0d3 | |
| parent | 9ef43fc782159893b7af139f9d9be3aec3108ecd (diff) | |
Allow `@(rodata)` on `@(static)` variables
| -rw-r--r-- | src/check_stmt.cpp | 6 | ||||
| -rw-r--r-- | src/llvm_backend_stmt.cpp | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index fc443a7b5..a1698bbfe 100644 --- a/src/check_stmt.cpp +++ b/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; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index b18db4e45..9f28e45e0 100644 --- a/src/llvm_backend_stmt.cpp +++ b/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); |