diff options
| author | Pekka Enberg <penberg@kernel.org> | 2011-11-21 22:03:03 +0200 |
|---|---|---|
| committer | Pekka Enberg <penberg@kernel.org> | 2011-11-21 22:03:03 +0200 |
| commit | f6a6a4d7c3268952da9b9983f17001544159318b (patch) | |
| tree | 15d3d8766ed77d388ee247718169d6072f96bbb8 | |
| parent | 064c4adfb5fdf0403614cb0a5a1a6373e88866b8 (diff) | |
| download | sparse-dev-f6a6a4d7c3268952da9b9983f17001544159318b.tar.gz | |
sparse, llvm: Fix symbol initializer code generation
The output_data() function does not see right hand side symbols for expressions
such as this in target.c:
struct symbol *size_t_ctype = &uint_ctype;
Therefore, call output_data() recursively if LLVMGetNamedGlobal() returns NULL
for a symbol.
Cc: Christopher Li <sparse@chrisli.org>
Cc: Jeff Garzik <jgarzik@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
| -rw-r--r-- | sparse-llvm.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index c037e026..ca49a6e1 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -1055,7 +1055,7 @@ static void output_fn(LLVMModuleRef module, struct entrypoint *ep) END_FOR_EACH_PTR(bb); } -static int output_data(LLVMModuleRef module, struct symbol *sym) +static LLVMValueRef output_data(LLVMModuleRef module, struct symbol *sym) { struct expression *initializer = sym->initializer; LLVMValueRef initial_value; @@ -1071,6 +1071,8 @@ static int output_data(LLVMModuleRef module, struct symbol *sym) struct symbol *sym = initializer->symbol; initial_value = LLVMGetNamedGlobal(module, show_ident(sym->ident)); + if (!initial_value) + initial_value = output_data(module, sym); break; } default: @@ -1090,7 +1092,7 @@ static int output_data(LLVMModuleRef module, struct symbol *sym) LLVMSetInitializer(data, initial_value); - return 0; + return data; } static int compile(LLVMModuleRef module, struct symbol_list *list) |
