@@ -750,7 +750,7 @@ void read_lvalue(lvalue_t *lvalue,
750
750
var_t * var ,
751
751
block_t * parent ,
752
752
basic_block_t * * bb ,
753
- int eval ,
753
+ bool eval ,
754
754
opcode_t op );
755
755
756
756
/* Maintain a stack of expression values and operators, depending on next
@@ -805,7 +805,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
805
805
806
806
lex_peek (T_identifier , token );
807
807
var_t * var = find_var (token , parent );
808
- read_lvalue (& lvalue , var , parent , bb , 0 , OP_generic );
808
+ read_lvalue (& lvalue , var , parent , bb , false , OP_generic );
809
809
810
810
if (!lvalue .is_reference ) {
811
811
ph1_ir = add_ph1_ir (OP_address_of );
@@ -825,7 +825,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
825
825
int open_bracket = lex_accept (T_open_bracket );
826
826
lex_peek (T_identifier , token );
827
827
var_t * var = find_var (token , parent );
828
- read_lvalue (& lvalue , var , parent , bb , 1 , OP_generic );
828
+ read_lvalue (& lvalue , var , parent , bb , true , OP_generic );
829
829
if (open_bracket )
830
830
lex_expect (T_close_bracket );
831
831
@@ -962,7 +962,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
962
962
} else if (var ) {
963
963
/* evalue lvalue expression */
964
964
lvalue_t lvalue ;
965
- read_lvalue (& lvalue , var , parent , bb , 1 , prefix_op );
965
+ read_lvalue (& lvalue , var , parent , bb , true , prefix_op );
966
966
967
967
/* is it an indirect call with function pointer? */
968
968
if (lex_peek (T_open_bracket , NULL )) {
@@ -1234,13 +1234,13 @@ void read_lvalue(lvalue_t *lvalue,
1234
1234
var_t * var ,
1235
1235
block_t * parent ,
1236
1236
basic_block_t * * bb ,
1237
- int eval ,
1237
+ bool eval ,
1238
1238
opcode_t prefix_op )
1239
1239
{
1240
1240
ph1_ir_t * ph1_ir ;
1241
1241
var_t * vd ;
1242
- int is_address_got = 0 ;
1243
- int is_member = 0 ;
1242
+ bool is_address_got = false ;
1243
+ bool is_member = false ;
1244
1244
1245
1245
/* already peeked and have the variable */
1246
1246
lex_expect (T_identifier );
@@ -1260,6 +1260,23 @@ void read_lvalue(lvalue_t *lvalue,
1260
1260
while (lex_peek (T_open_square , NULL ) || lex_peek (T_arrow , NULL ) ||
1261
1261
lex_peek (T_dot , NULL )) {
1262
1262
if (lex_accept (T_open_square )) {
1263
+ /* if subscripted member's is not yet resolved, dereference to
1264
+ * resolve base address.
1265
+ * e.g., dereference of "->" in "data->raw[0]" would be performed
1266
+ * here.
1267
+ */
1268
+ if (lvalue -> is_reference && lvalue -> is_ptr && is_member ) {
1269
+ ph1_ir = add_ph1_ir (OP_read );
1270
+ ph1_ir -> src0 = opstack_pop ();
1271
+ vd = require_var (parent );
1272
+ strcpy (vd -> var_name , gen_name ());
1273
+ ph1_ir -> dest = vd ;
1274
+ opstack_push (vd );
1275
+ ph1_ir -> size = 4 ;
1276
+ add_insn (parent , * bb , OP_read , ph1_ir -> dest , ph1_ir -> src0 , NULL ,
1277
+ ph1_ir -> size , NULL );
1278
+ }
1279
+
1263
1280
/* var must be either a pointer or an array of some type */
1264
1281
if (var -> is_ptr == 0 && var -> array_size == 0 )
1265
1282
error ("Cannot apply square operator to non-pointer" );
@@ -1303,8 +1320,8 @@ void read_lvalue(lvalue_t *lvalue,
1303
1320
ph1_ir -> src1 , 0 , NULL );
1304
1321
1305
1322
lex_expect (T_close_square );
1306
- is_address_got = 1 ;
1307
- is_member = 1 ;
1323
+ is_address_got = true ;
1324
+ is_member = true ;
1308
1325
lvalue -> is_reference = true;
1309
1326
} else {
1310
1327
char token [MAX_ID_LEN ];
@@ -1313,7 +1330,7 @@ void read_lvalue(lvalue_t *lvalue,
1313
1330
/* resolve where the pointer points at from the calculated
1314
1331
* address in a structure.
1315
1332
*/
1316
- if (is_member == 1 ) {
1333
+ if (is_member ) {
1317
1334
ph1_ir = add_ph1_ir (OP_read );
1318
1335
ph1_ir -> src0 = opstack_pop ();
1319
1336
vd = require_var (parent );
@@ -1327,7 +1344,7 @@ void read_lvalue(lvalue_t *lvalue,
1327
1344
} else {
1328
1345
lex_expect (T_dot );
1329
1346
1330
- if (is_address_got == 0 ) {
1347
+ if (! is_address_got ) {
1331
1348
ph1_ir = add_ph1_ir (OP_address_of );
1332
1349
ph1_ir -> src0 = opstack_pop ();
1333
1350
vd = require_var (parent );
@@ -1337,7 +1354,7 @@ void read_lvalue(lvalue_t *lvalue,
1337
1354
add_insn (parent , * bb , OP_address_of , ph1_ir -> dest ,
1338
1355
ph1_ir -> src0 , NULL , 0 , NULL );
1339
1356
1340
- is_address_got = 1 ;
1357
+ is_address_got = true ;
1341
1358
}
1342
1359
}
1343
1360
@@ -1376,8 +1393,8 @@ void read_lvalue(lvalue_t *lvalue,
1376
1393
add_insn (parent , * bb , OP_add , ph1_ir -> dest , ph1_ir -> src0 ,
1377
1394
ph1_ir -> src1 , 0 , NULL );
1378
1395
1379
- is_address_got = 1 ;
1380
- is_member = 1 ;
1396
+ is_address_got = true ;
1397
+ is_member = true ;
1381
1398
}
1382
1399
}
1383
1400
@@ -1860,7 +1877,7 @@ bool read_body_assignment(char *token,
1860
1877
int size = 0 ;
1861
1878
1862
1879
/* has memory address that we want to set */
1863
- read_lvalue (& lvalue , var , parent , bb , 0 , OP_generic );
1880
+ read_lvalue (& lvalue , var , parent , bb , false , OP_generic );
1864
1881
size = lvalue .size ;
1865
1882
1866
1883
if (lex_accept (T_increment )) {
0 commit comments