@@ -303,7 +303,7 @@ static LLVMValueRef get_sym_value(struct function *fn, struct symbol *sym)
assert(sym->bb_target == NULL);
expr = sym->initializer;
- if (expr) {
+ if (expr && !sym->ident) {
switch (expr->type) {
case EXPR_STRING: {
const char *s = expr->string->data;
@@ -318,13 +318,6 @@ static LLVMValueRef get_sym_value(struct function *fn, struct symbol *sym)
result = LLVMConstGEP(data, indices, ARRAY_SIZE(indices));
return result;
}
- case EXPR_SYMBOL: {
- struct symbol *sym = expr->symbol;
-
- result = LLVMGetNamedGlobal(fn->module, show_ident(sym->ident));
- assert(result != NULL);
- break;
- }
default:
break;
}
@@ -1212,7 +1205,7 @@ static LLVMValueRef output_data(LLVMModuleRef module, struct symbol *sym)
initial_value = LLVMConstNull(type);
}
- name = show_ident(sym->ident);
+ name = sym->ident ? show_ident(sym->ident) : "" ;
data = LLVMAddGlobal(module, LLVMTypeOf(initial_value), name);
new file mode 100644
@@ -0,0 +1,21 @@
+const char *s = "abc";
+int x = 4;
+int y;
+
+int *p = &x;
+int *q;
+
+int loadn(void) { return y; }
+int loadi(void) { return x; }
+
+const char *loads(void) { return s; }
+
+int *retpn(void) { return q; }
+int loadpn(void) { return *q; }
+int *retpi(void) { return p; }
+int loadpi(void) { return *p; }
+
+/*
+ * check-name: use simple value from global vars
+ * check-command: ./sparsec -Wno-decl -c $file -o tmp.o
+ */
new file mode 100644
@@ -0,0 +1,21 @@
+extern void use(const char *);
+
+const char *ret(void)
+{
+ return "abc";
+}
+
+const char *add(void)
+{
+ return "def" + 1;
+}
+
+void call(void)
+{
+ use("ijk");
+}
+
+/*
+ * check-name: string-value
+ * check-command: ./sparsec -Wno-decl -c $file -o tmp.o
+ */
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- sparse-llvm.c | 11 ++--------- validation/backend/load-global.c | 21 +++++++++++++++++++++ validation/backend/string-value.c | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 validation/backend/load-global.c create mode 100644 validation/backend/string-value.c