aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-19 22:28:48 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-11-17 10:04:37 +0100
commit3065391a5fa46e507f88ffec3291311a2dee8e0e (patch)
tree60f1cd210417d2549ebca87f251a2bd0449b8ac0
parent21b2801285102bbaed6247c04169fa8366a873ad (diff)
downloadsparse-dev-3065391a5fa46e507f88ffec3291311a2dee8e0e.tar.gz
llvm: add support for OP_SETVAL with floats
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--sparse-llvm.c19
-rw-r--r--validation/backend/setval.c7
2 files changed, 25 insertions, 1 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 3dbb9874..83df9f83 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -857,6 +857,23 @@ static void output_op_cast(struct function *fn, struct instruction *insn, LLVMOp
insn->target->priv = target;
}
+static void output_op_setval(struct function *fn, struct instruction *insn)
+{
+ struct expression *val = insn->val;
+ LLVMTypeRef dtype = symbol_type(insn->type);
+ LLVMValueRef target;
+
+ switch (val->type) {
+ case EXPR_FVALUE:
+ target = LLVMConstReal(dtype, val->fvalue);
+ break;
+ default:
+ assert(0);
+ }
+
+ insn->target->priv = target;
+}
+
static void output_insn(struct function *fn, struct instruction *insn)
{
switch (insn->opcode) {
@@ -873,7 +890,7 @@ static void output_insn(struct function *fn, struct instruction *insn)
assert(0);
break;
case OP_SETVAL:
- assert(0);
+ output_op_setval(fn, insn);
break;
case OP_SWITCH:
output_op_switch(fn, insn);
diff --git a/validation/backend/setval.c b/validation/backend/setval.c
new file mode 100644
index 00000000..e3557571
--- /dev/null
+++ b/validation/backend/setval.c
@@ -0,0 +1,7 @@
+double setfval64(void) { return 1.23; }
+float setfval32(void) { return 1.23F; }
+
+/*
+ * check-name: setval-float
+ * check-command: ./sparsec -Wno-decl -c $file -o tmp.o
+ */