diff options
author | Jeff Garzik <jeff@garzik.org> | 2011-08-30 13:31:22 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2011-08-30 13:37:43 -0400 |
commit | 0b5f89d81c2b0a499a4d117388b9badbb028a72d (patch) | |
tree | 1b827a0c238ace34a55b5ed206296b8ea77cf0fd | |
parent | c19ad437aee130bfde2ac41494d3a46900670dc6 (diff) | |
download | sparse-0b5f89d81c2b0a499a4d117388b9badbb028a72d.tar.gz |
sparse, llvm: create helper for obtaining instruction's type
Use with PSEUDO_VAL.
Also, remove needless braces around PSEUDO_ARG.
-rw-r--r-- | sparse-llvm.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index bbf8646a..6557790d 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -26,6 +26,8 @@ struct function { static inline bool symbol_is_fp_type(struct symbol *sym) { + if (!sym) + return NULL; return sym->ctype.base_type == &fp_type; } @@ -71,6 +73,25 @@ static LLVMTypeRef symbol_type(struct symbol *sym) return ret; } +static LLVMTypeRef insn_symbol_type(struct instruction *insn) +{ + if (insn->type) + return symbol_type(insn->type); + + switch (insn->size) { + case 8: return LLVMInt8Type(); + case 16: return LLVMInt16Type(); + case 32: return LLVMInt32Type(); + case 64: return LLVMInt64Type(); + + default: + die("invalid bit size %d", insn->size); + break; + } + + return NULL; /* not reached */ +} + static LLVMLinkage data_linkage(struct symbol *sym) { if (sym->ctype.modifiers & MOD_STATIC) @@ -151,7 +172,7 @@ static LLVMValueRef pseudo_to_value(struct function *fn, struct instruction *ins break; } case PSEUDO_VAL: - result = LLVMConstInt(symbol_type(insn->type), pseudo->value, 1); + result = LLVMConstInt(insn_symbol_type(insn), pseudo->value, 1); break; case PSEUDO_ARG: { result = LLVMGetParam(fn->fn, pseudo->nr - 1); @@ -204,12 +225,11 @@ static LLVMTypeRef pseudo_type(struct instruction *insn, pseudo_t pseudo) break; } case PSEUDO_VAL: - result = symbol_type(insn->type); + result = insn_symbol_type(insn); break; - case PSEUDO_ARG: { + case PSEUDO_ARG: assert(0); break; - } case PSEUDO_PHI: assert(0); break; @@ -567,7 +587,7 @@ static void output_op_phi(struct function *fn, struct instruction *insn) pseudo_t phi; LLVMValueRef target; - target = LLVMBuildPhi(fn->builder, symbol_type(insn->type), + target = LLVMBuildPhi(fn->builder, insn_symbol_type(insn), "phi"); int pll = 0; FOR_EACH_PTR(insn->phi_list, phi) { @@ -609,9 +629,9 @@ static void output_op_cast(struct function *fn, struct instruction *insn, LLVMOp assert(!symbol_is_fp_type(insn->type)); if (insn->size < LLVMGetIntTypeWidth(LLVMTypeOf(src))) - target = LLVMBuildTrunc(fn->builder, src, symbol_type(insn->type), target_name); + target = LLVMBuildTrunc(fn->builder, src, insn_symbol_type(insn), target_name); else - target = LLVMBuildCast(fn->builder, op, src, symbol_type(insn->type), target_name); + target = LLVMBuildCast(fn->builder, op, src, insn_symbol_type(insn), target_name); insn->target->priv = target; } |