@@ -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" );
0 commit comments