aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/print_llvm.cpp10
-rw-r--r--src/codegen/ssa.cpp7
2 files changed, 15 insertions, 2 deletions
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index 36b9156de..4c358f31b 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -210,7 +210,15 @@ void ssa_print_exact_value(gbFile *f, ssaModule *m, ExactValue value, Type *type
ssa_fprintf(f, "\"");
} break;
case ExactValue_Integer: {
- ssa_fprintf(f, "%lld", value.value_integer);
+ if (is_type_pointer(get_base_type(type))) {
+ if (value.value_integer == 0) {
+ ssa_fprintf(f, "null");
+ } else {
+ GB_PANIC("TODO(bill): Pointer constant");
+ }
+ } else {
+ ssa_fprintf(f, "%lld", value.value_integer);
+ }
} break;
case ExactValue_Float: {
u64 u = *cast(u64*)&value.value_float;
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index 3e19e5932..f6497fc81 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -1355,6 +1355,11 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t) {
return ssa_emit(proc, ssa_make_instr_conv(proc, ssaConv_bitcast, value, src, dst));
}
+ // proc <-> proc
+ if (is_type_proc(src) && is_type_proc(dst)) {
+ return ssa_emit(proc, ssa_make_instr_conv(proc, ssaConv_bitcast, value, src, dst));
+ }
+
// []byte/[]u8 <-> string
if (is_type_u8_slice(src) && is_type_string(dst)) {
@@ -1743,7 +1748,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
// NOTE(bill): Regular call
ssaValue *value = ssa_build_expr(proc, ce->proc);
- Type *proc_type_ = ssa_value_type(value);
+ Type *proc_type_ = get_base_type(ssa_value_type(value));
GB_ASSERT(proc_type_->kind == Type_Proc);
auto *type = &proc_type_->proc;