Skip to content

Commit e5cc94c

Browse files
authored
Merge pull request #207 from ChAoSUnItY/feat/global_str
Support global string initialization
2 parents 8f2b234 + f9086bc commit e5cc94c

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)