|
@@ -39,8 +39,7 @@ let rec consts_to_vars node =
|
|
|
|
|
|
|
|
| node -> transform_children consts_to_vars node
|
|
| node -> transform_children consts_to_vars node
|
|
|
|
|
|
|
|
-let make_dims basename values make_dec =
|
|
|
|
|
- let make_dimname i _ = basename ^ "$" ^ string_of_int (i + 1) in
|
|
|
|
|
|
|
+let make_dims make_dimname values make_dec =
|
|
|
let names = mapi make_dimname values in
|
|
let names = mapi make_dimname values in
|
|
|
|
|
|
|
|
let decs = List.map2 make_dec values names in
|
|
let decs = List.map2 make_dec values names in
|
|
@@ -55,13 +54,22 @@ let make_dims basename values make_dec =
|
|
|
let rec array_dims node =
|
|
let rec array_dims node =
|
|
|
match node with
|
|
match node with
|
|
|
| VarDec (ArrayDims (ctype, values), name, init, ann) ->
|
|
| VarDec (ArrayDims (ctype, values), name, init, ann) ->
|
|
|
|
|
+ (* Names for VarDec dimensions must be unique to avoid weid errors when
|
|
|
|
|
+ * during context analysis, when an array variable is redeclared within the
|
|
|
|
|
+ * same scope *)
|
|
|
|
|
+ let make_dimname i _ = fresh_const (name ^ "$" ^ string_of_int (i + 1)) in
|
|
|
|
|
+
|
|
|
let make_dec value name = VarDec (Int, name, Some value, []) in
|
|
let make_dec value name = VarDec (Int, name, Some value, []) in
|
|
|
- let (decs, dims) = make_dims (name ^ "$dim$") values make_dec in
|
|
|
|
|
|
|
+ let (decs, dims) = make_dims make_dimname values make_dec in
|
|
|
Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
|
|
Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
|
|
|
|
|
|
|
|
| GlobalDef (export, ArrayDims (ctype, values), name, None, ann) ->
|
|
| GlobalDef (export, ArrayDims (ctype, values), name, None, ann) ->
|
|
|
|
|
+ (* For global decs, the name must also be unique, but not constant (no $$in
|
|
|
|
|
+ * the name) since the variable must exist for exporting *)
|
|
|
|
|
+ let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
|
|
|
|
|
+
|
|
|
let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
|
|
let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
|
|
|
- let (decs, dims) = make_dims name values make_dec in
|
|
|
|
|
|
|
+ let (decs, dims) = make_dims make_dimname values make_dec in
|
|
|
Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, None, ann)])
|
|
Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, None, ann)])
|
|
|
|
|
|
|
|
(*
|
|
(*
|