aboutsummaryrefslogtreecommitdiffstats
path: root/cfrontend
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@college-de-france.fr>2020-12-30 11:00:22 +0100
committerXavier Leroy <xavierleroy@users.noreply.github.com>2021-02-23 11:33:14 +0100
commited89275cb820bb7ab283c51e461d852d1c8bec63 (patch)
treee076d92145806c6de92194dfa816e9944c2d27f2 /cfrontend
parent30feb31c6d6e9235acad42ec5d09d14f3919cc36 (diff)
downloadcompcert-kvx-ed89275cb820bb7ab283c51e461d852d1c8bec63.tar.gz
compcert-kvx-ed89275cb820bb7ab283c51e461d852d1c8bec63.zip
Section handling: finer control of variable initialization
Distinguish between: - uninitialized variables, which can go in COMM if supported - variables initialized with fixed, numeric quantities, which can go in a readonly section if "const" - variables initialized with symbol addresses which may need relocation, which cannot go in a readonly section even if "const", but can go in a special "const_data" section. Also: on macOS, use ".const" instead of ".literal8" for literals, as not all literals have size 8.
Diffstat (limited to 'cfrontend')
-rw-r--r--cfrontend/C2C.ml7
1 files changed, 6 insertions, 1 deletions
diff --git a/cfrontend/C2C.ml b/cfrontend/C2C.ml
index 186c3155..fee3d86e 100644
--- a/cfrontend/C2C.ml
+++ b/cfrontend/C2C.ml
@@ -1333,8 +1333,13 @@ let convertGlobvar loc env (sto, id, ty, optinit) =
if sto = C.Storage_extern then [] else [AST.Init_space sz]
| Some i ->
convertInitializer env ty i in
+ let initialized =
+ if optinit = None then Sections.Uninit else
+ if List.exists (function AST.Init_addrof _ -> true | _ -> false) init'
+ then Sections.Init_reloc
+ else Sections.Init in
let (section, access) =
- Sections.for_variable env loc id' ty (optinit <> None) in
+ Sections.for_variable env loc id' ty initialized in
if Z.gt sz (Z.of_uint64 0xFFFF_FFFFL) then
error "'%s' is too big (%s bytes)"
id.name (Z.to_string sz);