@@ -1989,10 +1989,19 @@ bool read_global_assignment(char *token)
19891989{
19901990 var_t * vd , * rs1 , * var ;
19911991 block_t * parent = GLOBAL_BLOCK ;
1992+ basic_block_t * bb = GLOBAL_FUNC -> bbs ;
19921993
19931994 /* global initialization must be constant */
19941995 var = find_global_var (token );
19951996 if (var ) {
1997+ if (lex_peek (T_string , NULL )) {
1998+ read_literal_param (parent , bb );
1999+ rs1 = opstack_pop ();
2000+ vd = var ;
2001+ add_insn (parent , bb , OP_assign , vd , rs1 , NULL , 0 , NULL );
2002+ return true;
2003+ }
2004+
19962005 opcode_t op_stack [10 ];
19972006 opcode_t op , next_op ;
19982007 int val_stack [10 ];
@@ -2005,13 +2014,11 @@ bool read_global_assignment(char *token)
20052014 vd = require_var (parent );
20062015 gen_name_to (vd -> var_name );
20072016 vd -> init_val = operand1 ;
2008- add_insn (parent , GLOBAL_FUNC -> bbs , OP_load_constant , vd , NULL , NULL ,
2009- 0 , NULL );
2017+ add_insn (parent , bb , OP_load_constant , vd , NULL , NULL , 0 , NULL );
20102018
20112019 rs1 = vd ;
20122020 vd = opstack_pop ();
2013- add_insn (parent , GLOBAL_FUNC -> bbs , OP_assign , vd , rs1 , NULL , 0 ,
2014- NULL );
2021+ add_insn (parent , bb , OP_assign , vd , rs1 , NULL , 0 , NULL );
20152022 return true;
20162023 }
20172024 if (op == OP_ternary ) {
@@ -2026,13 +2033,11 @@ bool read_global_assignment(char *token)
20262033 vd = require_var (parent );
20272034 gen_name_to (vd -> var_name );
20282035 vd -> init_val = eval_expression_imm (op , operand1 , operand2 );
2029- add_insn (parent , GLOBAL_FUNC -> bbs , OP_load_constant , vd , NULL , NULL ,
2030- 0 , NULL );
2036+ add_insn (parent , bb , OP_load_constant , vd , NULL , NULL , 0 , NULL );
20312037
20322038 rs1 = vd ;
20332039 vd = opstack_pop ();
2034- add_insn (parent , GLOBAL_FUNC -> bbs , OP_assign , vd , rs1 , NULL , 0 ,
2035- NULL );
2040+ add_insn (parent , bb , OP_assign , vd , rs1 , NULL , 0 , NULL );
20362041 return true;
20372042 }
20382043 if (op == OP_ternary ) {
@@ -2098,13 +2103,12 @@ bool read_global_assignment(char *token)
20982103 vd = require_var (parent );
20992104 gen_name_to (vd -> var_name );
21002105 vd -> init_val = val_stack [0 ];
2101- add_insn (parent , GLOBAL_FUNC -> bbs , OP_load_constant , vd ,
2102- NULL , NULL , 0 , NULL );
2106+ add_insn (parent , bb , OP_load_constant , vd , NULL , NULL , 0 ,
2107+ NULL );
21032108
21042109 rs1 = vd ;
21052110 vd = opstack_pop ();
2106- add_insn (parent , GLOBAL_FUNC -> bbs , OP_assign , vd , rs1 , NULL ,
2107- 0 , NULL );
2111+ add_insn (parent , bb , OP_assign , vd , rs1 , NULL , 0 , NULL );
21082112 }
21092113 return true;
21102114 }
@@ -2728,13 +2732,13 @@ void read_global_decl(block_t *block)
27282732
27292733 /* is a variable */
27302734 if (lex_accept (T_assign )) {
2731- if (var -> is_ptr == 0 && var -> array_size == 0 ) {
2735+ if (var -> array_size == 0 ) {
27322736 read_global_assignment (var -> var_name );
27332737 lex_expect (T_semicolon );
27342738 return ;
27352739 }
2736- /* TODO: support global initialization for array and pointer */
2737- error ("Global initialization for array and pointer not supported" );
2740+ /* TODO: support global initialization for array */
2741+ error ("Global initialization for array is not supported" );
27382742 } else if (lex_accept (T_comma ))
27392743 /* TODO: continuation */
27402744 error ("Global continuation not supported" );
0 commit comments