Disallow slicing of constant values

This commit is contained in:
gingerBill
2021-05-15 16:40:40 +01:00
parent 63b54ce7c6
commit b01c2e1017
2 changed files with 28 additions and 4 deletions

View File

@@ -11360,6 +11360,15 @@ lbValue lb_find_ident(lbProcedure *p, lbModule *m, Entity *e, Ast *expr) {
return {};
}
bool lb_is_expr_constant_zero(Ast *expr) {
GB_ASSERT(expr != nullptr);
auto v = exact_value_to_integer(expr->tav.value);
if (v.kind == ExactValue_Integer) {
return big_int_cmp_zero(&v.value_integer) == 0;
}
return false;
}
lbValue lb_build_expr(lbProcedure *p, Ast *expr) {
lbModule *m = p->module;
@@ -11683,6 +11692,13 @@ lbValue lb_build_expr(lbProcedure *p, Ast *expr) {
case_end;
case_ast_node(se, SliceExpr, expr);
if (is_type_slice(type_of_expr(se->expr))) {
// NOTE(bill): Quick optimization
if (se->high == nullptr &&
(se->low == nullptr || lb_is_expr_constant_zero(se->low))) {
return lb_build_expr(p, se->expr);
}
}
return lb_addr_load(p, lb_build_addr(p, expr));
case_end;
@@ -12303,6 +12319,7 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) {
case_end;
case_ast_node(se, SliceExpr, expr);
lbValue low = lb_const_int(p->module, t_int, 0);
lbValue high = {};
@@ -13268,7 +13285,7 @@ lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value) {
g.type = alloc_type_pointer(type);
g.value = LLVMAddGlobal(m->mod, lb_type(m, type), cast(char const *)str);
if (value.value != nullptr) {
GB_ASSERT(LLVMIsConstant(value.value));
GB_ASSERT_MSG(LLVMIsConstant(value.value), LLVMPrintValueToString(value.value));
LLVMSetInitializer(g.value, value.value);
} else {
LLVMSetInitializer(g.value, LLVMConstNull(lb_type(m, type)));