diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-03-18 12:18:46 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-11-17 10:04:37 +0100 |
| commit | 880cd2465e6f2badda7c7e9e81d1d4cca7a35833 (patch) | |
| tree | 7c363298475e564ef5f043b468a6b0b6bb3c6dea | |
| parent | 5bd565dd77ec91c992e01638cc8f32d6bc51b44a (diff) | |
| download | sparse-dev-880cd2465e6f2badda7c7e9e81d1d4cca7a35833.tar.gz | |
llvm: take care of degenerated rvalues
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | sparse-llvm.c | 14 | ||||
| -rw-r--r-- | validation/backend/degenerate-ptr.c | 1 | ||||
| -rw-r--r-- | validation/backend/function-ptr.c | 1 | ||||
| -rw-r--r-- | validation/backend/pointer-param.c | 1 | ||||
| -rw-r--r-- | validation/backend/symaddr.c | 1 |
5 files changed, 12 insertions, 6 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index 08f055a9..0043b797 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -403,6 +403,16 @@ static LLVMValueRef pseudo_to_value(struct function *fn, struct symbol *ctype, p return result; } +static LLVMValueRef pseudo_to_rvalue(struct function *fn, struct symbol *ctype, pseudo_t pseudo) +{ + LLVMValueRef val = pseudo_to_value(fn, ctype, pseudo); + LLVMTypeRef dtype = symbol_type(ctype); + char name[MAX_PSEUDO_NAME]; + + pseudo_name(pseudo, name); + return LLVMBuildBitCast(fn->builder, val, dtype, name); +} + static LLVMValueRef value_to_ivalue(struct function *fn, struct symbol *ctype, LLVMValueRef val) { const char *name = LLVMGetValueName(val); @@ -712,7 +722,7 @@ static void output_op_store(struct function *fn, struct instruction *insn) addr = calc_memop_addr(fn, insn); - target_in = pseudo_to_value(fn, insn->type, insn->target); + target_in = pseudo_to_rvalue(fn, insn->type, insn->target); /* perform store */ LLVMBuildStore(fn->builder, target_in, addr); @@ -800,7 +810,7 @@ static void output_op_call(struct function *fn, struct instruction *insn) i = 0; FOR_EACH_PTR(insn->arguments, arg) { NEXT_PTR_LIST(ctype); - args[i++] = pseudo_to_value(fn, ctype, arg); + args[i++] = pseudo_to_rvalue(fn, ctype, arg); } END_FOR_EACH_PTR(arg); FINISH_PTR_LIST(ctype); diff --git a/validation/backend/degenerate-ptr.c b/validation/backend/degenerate-ptr.c index 5e71d0d8..8de979e0 100644 --- a/validation/backend/degenerate-ptr.c +++ b/validation/backend/degenerate-ptr.c @@ -69,5 +69,4 @@ void global(void) /* * check-name: degenerated pointer handling * check-command: ./sparsec -c $file -o tmp.o - * check-known-to-fail */ diff --git a/validation/backend/function-ptr.c b/validation/backend/function-ptr.c index dbf3cab3..4fac9dc2 100644 --- a/validation/backend/function-ptr.c +++ b/validation/backend/function-ptr.c @@ -150,5 +150,4 @@ void ops(int a, int *p, struct ops *ops) /* * check-name: Function pointer code generation * check-command: sparsec -c $file -o tmp.o - * check-known-to-fail */ diff --git a/validation/backend/pointer-param.c b/validation/backend/pointer-param.c index 745d069f..b705e6f4 100644 --- a/validation/backend/pointer-param.c +++ b/validation/backend/pointer-param.c @@ -39,5 +39,4 @@ void foo(int *p, int a[5], int (*pfun)(int)) /* * check-name: pointer-param * check-command: ./sparsec -c $file -o tmp.o - * check-known-to-fail */ diff --git a/validation/backend/symaddr.c b/validation/backend/symaddr.c index 8b450111..71fb9def 100644 --- a/validation/backend/symaddr.c +++ b/validation/backend/symaddr.c @@ -67,5 +67,4 @@ void gfoo(int *p, int a) /* * check-name: symbol address * check-command: ./sparsec -Wno-decl -c $file -o tmp.o - * check-known-to-fail */ |
