aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorPekka Enberg <penberg@kernel.org>2011-08-23 18:06:09 +0300
committerPekka Enberg <penberg@kernel.org>2011-08-23 18:08:32 +0300
commit0a700caa38a078d2cc2ca752b776c4440782fca4 (patch)
tree80070fcc68473b85b34bfff89c7f6325421d30ff
parent61ae98edba8f01b7352066eb13da6ecf39511675 (diff)
downloadsparse-dev-0a700caa38a078d2cc2ca752b776c4440782fca4.tar.gz
sparse, llvm: Fix global variable initialization
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--sparse-llvm.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 792f8253..24bc6000 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -48,7 +48,7 @@ static LLVMLinkage data_linkage(struct symbol *sym)
if (sym->ctype.modifiers & MOD_STATIC)
return LLVMPrivateLinkage;
- return LLVMCommonLinkage;
+ return LLVMExternalLinkage;
}
static LLVMLinkage function_linkage(struct symbol *sym)
@@ -128,16 +128,25 @@ static void output_fn(LLVMModuleRef module, struct entrypoint *ep)
static int output_data(LLVMModuleRef module, struct symbol *sym)
{
+ struct expression *initializer = sym->initializer;
+ unsigned long long initial_value = 0;
LLVMValueRef data;
const char *name;
+ if (initializer) {
+ if (initializer->type == EXPR_VALUE)
+ initial_value = initializer->value;
+ else
+ assert(0);
+ }
+
name = show_ident(sym->ident);
data = LLVMAddGlobal(module, symbol_type(sym->ctype.base_type), name);
LLVMSetLinkage(data, data_linkage(sym));
- LLVMSetInitializer(data, LLVMConstInt(symbol_type(sym), 0, 1));
+ LLVMSetInitializer(data, LLVMConstInt(symbol_type(sym), initial_value, 1));
return 0;
}