Skip to content

Commit f9086bc

Browse files
committed
Support global string initialization
This patch supports global string initialization, and allows integer values to be used as address value of any pointer type.
1 parent 8f2b234 commit f9086bc

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

src/parser.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2078,10 +2078,19 @@ bool read_global_assignment(char *token)
20782078
{
20792079
var_t *vd, *rs1, *var;
20802080
block_t *parent = GLOBAL_BLOCK;
2081+
basic_block_t *bb = GLOBAL_FUNC->bbs;
20812082

20822083
/* global initialization must be constant */
20832084
var = find_global_var(token);
20842085
if (var) {
2086+
if (lex_peek(T_string, NULL)) {
2087+
read_literal_param(parent, bb);
2088+
rs1 = opstack_pop();
2089+
vd = var;
2090+
add_insn(parent, bb, OP_assign, vd, rs1, NULL, 0, NULL);
2091+
return true;
2092+
}
2093+
20852094
opcode_t op_stack[10];
20862095
opcode_t op, next_op;
20872096
int val_stack[10];
@@ -2094,13 +2103,11 @@ bool read_global_assignment(char *token)
20942103
vd = require_var(parent);
20952104
gen_name_to(vd->var_name);
20962105
vd->init_val = operand1;
2097-
add_insn(parent, GLOBAL_FUNC->bbs, OP_load_constant, vd, NULL, NULL,
2098-
0, NULL);
2106+
add_insn(parent, bb, OP_load_constant, vd, NULL, NULL, 0, NULL);
20992107

21002108
rs1 = vd;
21012109
vd = opstack_pop();
2102-
add_insn(parent, GLOBAL_FUNC->bbs, OP_assign, vd, rs1, NULL, 0,
2103-
NULL);
2110+
add_insn(parent, bb, OP_assign, vd, rs1, NULL, 0, NULL);
21042111
return true;
21052112
}
21062113
if (op == OP_ternary) {
@@ -2115,13 +2122,11 @@ bool read_global_assignment(char *token)
21152122
vd = require_var(parent);
21162123
gen_name_to(vd->var_name);
21172124
vd->init_val = eval_expression_imm(op, operand1, operand2);
2118-
add_insn(parent, GLOBAL_FUNC->bbs, OP_load_constant, vd, NULL, NULL,
2119-
0, NULL);
2125+
add_insn(parent, bb, OP_load_constant, vd, NULL, NULL, 0, NULL);
21202126

21212127
rs1 = vd;
21222128
vd = opstack_pop();
2123-
add_insn(parent, GLOBAL_FUNC->bbs, OP_assign, vd, rs1, NULL, 0,
2124-
NULL);
2129+
add_insn(parent, bb, OP_assign, vd, rs1, NULL, 0, NULL);
21252130
return true;
21262131
}
21272132
if (op == OP_ternary) {
@@ -2187,13 +2192,12 @@ bool read_global_assignment(char *token)
21872192
vd = require_var(parent);
21882193
gen_name_to(vd->var_name);
21892194
vd->init_val = val_stack[0];
2190-
add_insn(parent, GLOBAL_FUNC->bbs, OP_load_constant, vd,
2191-
NULL, NULL, 0, NULL);
2195+
add_insn(parent, bb, OP_load_constant, vd, NULL, NULL, 0,
2196+
NULL);
21922197

21932198
rs1 = vd;
21942199
vd = opstack_pop();
2195-
add_insn(parent, GLOBAL_FUNC->bbs, OP_assign, vd, rs1, NULL,
2196-
0, NULL);
2200+
add_insn(parent, bb, OP_assign, vd, rs1, NULL, 0, NULL);
21972201
}
21982202
return true;
21992203
}
@@ -2817,13 +2821,13 @@ void read_global_decl(block_t *block)
28172821

28182822
/* is a variable */
28192823
if (lex_accept(T_assign)) {
2820-
if (var->is_ptr == 0 && var->array_size == 0) {
2824+
if (var->array_size == 0) {
28212825
read_global_assignment(var->var_name);
28222826
lex_expect(T_semicolon);
28232827
return;
28242828
}
2825-
/* TODO: support global initialization for array and pointer */
2826-
error("Global initialization for array and pointer not supported");
2829+
/* TODO: support global initialization for array */
2830+
error("Global initialization for array is not supported");
28272831
} else if (lex_accept(T_comma))
28282832
/* TODO: continuation */
28292833
error("Global continuation not supported");

src/reg-alloc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,9 @@ void reg_alloc(void)
283283
}
284284
break;
285285
case OP_load_constant:
286+
case OP_load_data_address:
286287
dest = prepare_dest(GLOBAL_FUNC->bbs, global_insn->rd, -1, -1);
287-
ir = bb_add_ph2_ir(GLOBAL_FUNC->bbs, OP_load_constant);
288+
ir = bb_add_ph2_ir(GLOBAL_FUNC->bbs, global_insn->opcode);
288289
ir->src0 = global_insn->rd->init_val;
289290
ir->dest = dest;
290291
break;

src/ssa.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -880,11 +880,6 @@ void unwind_phi(void)
880880
free(args);
881881
}
882882

883-
/*
884-
* The current cfonrt does not yet support string literal addressing, which
885-
* results in the omission of basic block visualization during the stage-1 and
886-
* stage-2 bootstrapping phases.
887-
*/
888883
#ifdef __SHECC__
889884
#else
890885
void bb_dump_connection(FILE *fd,
@@ -896,13 +891,13 @@ void bb_dump_connection(FILE *fd,
896891

897892
switch (type) {
898893
case NEXT:
899-
str = &"%s_%p:s->%s_%p:n\n"[0];
894+
str = "%s_%p:s->%s_%p:n\n";
900895
break;
901896
case THEN:
902-
str = &"%s_%p:sw->%s_%p:n\n"[0];
897+
str = "%s_%p:sw->%s_%p:n\n";
903898
break;
904899
case ELSE:
905-
str = &"%s_%p:se->%s_%p:n\n"[0];
900+
str = "%s_%p:se->%s_%p:n\n";
906901
break;
907902
default:
908903
abort();
@@ -911,20 +906,20 @@ void bb_dump_connection(FILE *fd,
911906
char *pred;
912907
void *pred_id;
913908
if (curr->insn_list.tail) {
914-
pred = &"insn"[0];
909+
pred = "insn";
915910
pred_id = curr->insn_list.tail;
916911
} else {
917-
pred = &"pseudo"[0];
912+
pred = "pseudo";
918913
pred_id = curr;
919914
}
920915

921916
char *succ;
922917
void *succ_id;
923918
if (next->insn_list.tail) {
924-
succ = &"insn"[0];
919+
succ = "insn";
925920
succ_id = next->insn_list.head;
926921
} else {
927-
succ = &"pseudo"[0];
922+
succ = "pseudo";
928923
succ_id = next;
929924
}
930925

tests/driver.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,19 @@ int main()
13571357
}
13581358
EOF
13591359

1360+
# global string initialization and modification
1361+
try_output 0 "Hello World!Hallo World!" << EOF
1362+
char *data = "Hello World!";
1363+
1364+
int main(void)
1365+
{
1366+
printf(data);
1367+
data[1] = 'a';
1368+
printf(data);
1369+
return 0;
1370+
}
1371+
EOF
1372+
13601373
# global initialization with logical and equality operation
13611374
try_ 4 << EOF
13621375
int b1 = 1 && 1;

0 commit comments

Comments
 (0)