@@ -149,7 +149,7 @@ def xconstant_to_ast_expr(
149149 gvaddrtype = gvaddr .ctype (astree .ctyper )
150150 if gvaddrtype is not None and gvaddrtype .is_array :
151151 # array already is an address
152- return astree .mk_lval_expr (lval )
152+ return astree .mk_start_of (lval )
153153 else :
154154 return astree .mk_address_of (lval )
155155 else :
@@ -259,7 +259,7 @@ def vreturn_deref_value_to_ast_lval_expression(
259259 astree : ASTInterface ,
260260 anonymous : bool = False ) -> AST .ASTExpr :
261261
262- if not offset .is_constant_value_offset :
262+ if not ( offset .is_constant_value_offset or offset . is_no_offset ) :
263263 chklogger .logger .error (
264264 "Non-constant offset: %s not yet supported at address %s" ,
265265 str (offset ), iaddr )
@@ -669,7 +669,7 @@ def vinitmemory_value_to_ast_lval_expression(
669669
670670 if avar .is_memory_variable and avar .is_basevar_variable :
671671 avar = cast ("VMemoryVariable" , avar )
672- if not avar .offset .is_constant_value_offset :
672+ if not ( avar .offset .is_constant_value_offset or avar . offset . is_no_offset ) :
673673 chklogger .logger .error (
674674 "Non-constant offset: %s not yet supported at address %s" ,
675675 str (avar .offset ), iaddr )
@@ -852,6 +852,8 @@ def xvariable_to_ast_def_lval_expression(
852852 return astree .mk_temp_lval_expression ()
853853
854854 else :
855+ chklogger .logger .error (
856+ "No rdefs found for %s at address %s" , str (reg ), iaddr )
855857 return astree .mk_temp_lval_expression ()
856858
857859 if xvar .is_global_variable :
@@ -890,7 +892,17 @@ def xvariable_to_ast_def_lval_expression(
890892 return astree .mk_vinfo_lval_expression (vinfo , anonymous = anonymous )
891893
892894 if xvar .is_typecast_value :
893- tcvar = cast ("VTypeCastValue" , xvar .denotation )
895+ tcvar = cast ("VTypeCastValue" , xvar .denotation .auxvar )
896+ variaddr = tcvar .iaddr
897+ varreg = tcvar .register
898+ if variaddr in astree .ssa_intros and str (varreg ) in astree .ssa_intros [variaddr ]:
899+ vinfo = astree .ssa_intros [variaddr ][str (varreg )]
900+ ssavalue = astree .get_ssa_value (vinfo .vname )
901+ if ssavalue is not None :
902+ return ssavalue
903+ else :
904+ return astree .mk_vinfo_lval_expression (
905+ vinfo , anonymous = anonymous )
894906 chklogger .logger .error (
895907 "AST def conversion of typecast value %s to lval at address %s "
896908 + "not yet supported" ,
@@ -1755,19 +1767,32 @@ def vargument_deref_value_to_ast_lval(
17551767 anonymous : bool = False ) -> AST .ASTLval :
17561768
17571769 if offset .is_no_offset :
1758- asmvar = cast ("VAuxiliaryVariable" , basevar .denotation )
1759- vinitvar = cast ("VInitialRegisterValue" , asmvar .auxvar )
1760- xinitarg = vinitregister_value_to_ast_lval_expression (
1761- vinitvar , xdata , iaddr , astree , anonymous = anonymous )
1762- argtype = xinitarg .ctype (astree .ctyper )
1763- if argtype is None :
1764- chklogger .logger .error (
1765- "Untyped dereferenced argument value %s not yet supported at "
1766- + "address %s" ,
1767- str (xinitarg ), iaddr )
1768- return astree .mk_temp_lval ()
1769- else :
1770- return astree .mk_memref_lval (xinitarg , anonymous = anonymous )
1770+ if basevar .is_initial_register_value :
1771+ asmvar = cast ("VAuxiliaryVariable" , basevar .denotation )
1772+ vinitvar = cast ("VInitialRegisterValue" , asmvar .auxvar )
1773+ xinitarg = vinitregister_value_to_ast_lval_expression (
1774+ vinitvar , xdata , iaddr , astree , anonymous = anonymous )
1775+ argtype = xinitarg .ctype (astree .ctyper )
1776+ if argtype is None :
1777+ chklogger .logger .error (
1778+ "Untyped dereferenced argument value %s not yet supported at "
1779+ + "address %s" ,
1780+ str (xinitarg ), iaddr )
1781+ return astree .mk_temp_lval ()
1782+ else :
1783+ return astree .mk_memref_lval (xinitarg , anonymous = anonymous )
1784+
1785+ if basevar .is_function_return_value :
1786+ asmvar = cast ("VAuxiliaryVariable" , basevar .denotation )
1787+ frvinitrvar = cast ("VFunctionReturnValue" , asmvar .auxvar )
1788+ callsite = frvinitrvar .callsite
1789+ if callsite in astree .ssa_intros :
1790+ if len (astree .ssa_intros [callsite ]) == 1 :
1791+ vinfo = list (astree .ssa_intros [callsite ].values ())[0 ]
1792+ vtype = vinfo .vtype
1793+ vexpr = astree .mk_vinfo_lval_expression (
1794+ vinfo , anonymous = anonymous )
1795+ return astree .mk_memref_lval (vexpr , anonymous = anonymous )
17711796
17721797 if not offset .is_constant_value_offset :
17731798 chklogger .logger .error (
@@ -1977,6 +2002,7 @@ def xmemory_dereference_lval(
19772002 anonymous : bool = False ) -> AST .ASTLval :
19782003
19792004 xaddr = xxpr_to_ast_def_expr (address , xdata , iaddr , astree )
2005+
19802006 if xaddr .is_ast_binary_op :
19812007 xaddr = cast (AST .ASTBinaryOp , xaddr )
19822008 if xaddr .exp1 .is_ast_startof :
0 commit comments