aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorPekka Enberg <penberg@kernel.org>2011-11-21 22:03:03 +0200
committerPekka Enberg <penberg@kernel.org>2011-11-21 22:03:03 +0200
commitf6a6a4d7c3268952da9b9983f17001544159318b (patch)
tree15d3d8766ed77d388ee247718169d6072f96bbb8
parent064c4adfb5fdf0403614cb0a5a1a6373e88866b8 (diff)
downloadsparse-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.c6
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)