summaryrefslogtreecommitdiff
path: root/src/cmd/gc/pgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/gc/pgen.c')
-rw-r--r--src/cmd/gc/pgen.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c
index f9ff41c1b..583e77e4c 100644
--- a/src/cmd/gc/pgen.c
+++ b/src/cmd/gc/pgen.c
@@ -171,6 +171,7 @@ compile(Node *fn)
if(!debug['N'] || debug['R'] || debug['P']) {
regopt(ptxt);
}
+ expandchecks(ptxt);
oldstksize = stksize;
allocauto(ptxt);
@@ -504,3 +505,22 @@ movelargefn(Node *fn)
addrescapes(n);
}
}
+
+void
+cgen_checknil(Node *n)
+{
+ Node reg;
+
+ if(disable_checknil)
+ return;
+ while(n->op == ODOT || (n->op == OINDEX && isfixedarray(n->left->type->type))) // NOTE: not ODOTPTR
+ n = n->left;
+ if(thechar == '5' && n->op != OREGISTER) {
+ regalloc(&reg, types[tptr], N);
+ cgen(n, &reg);
+ gins(ACHECKNIL, &reg, N);
+ regfree(&reg);
+ return;
+ }
+ gins(ACHECKNIL, n, N);
+}