diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2020-12-30 11:00:22 +0100 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2021-02-23 11:33:14 +0100 |
commit | ed89275cb820bb7ab283c51e461d852d1c8bec63 (patch) | |
tree | e076d92145806c6de92194dfa816e9944c2d27f2 /cfrontend | |
parent | 30feb31c6d6e9235acad42ec5d09d14f3919cc36 (diff) | |
download | compcert-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.ml | 7 |
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); |