diff options
| author | Pekka Enberg <penberg@kernel.org> | 2011-08-23 18:06:09 +0300 |
|---|---|---|
| committer | Pekka Enberg <penberg@kernel.org> | 2011-08-23 18:08:32 +0300 |
| commit | 0a700caa38a078d2cc2ca752b776c4440782fca4 (patch) | |
| tree | 80070fcc68473b85b34bfff89c7f6325421d30ff | |
| parent | 61ae98edba8f01b7352066eb13da6ecf39511675 (diff) | |
| download | sparse-dev-0a700caa38a078d2cc2ca752b776c4440782fca4.tar.gz | |
sparse, llvm: Fix global variable initialization
Signed-off-by: Pekka Enberg <penberg@kernel.org>
| -rw-r--r-- | sparse-llvm.c | 13 |
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; } |
