diff options
| author | Momchil Velikov <momchil.velikov@arm.com> | 2021-05-24 21:40:47 +0100 |
|---|---|---|
| committer | Momchil Velikov <momchil.velikov@arm.com> | 2021-05-24 22:04:15 +0100 |
| commit | 13dd65b3a1a3ac049b5f3a9712059f7c61649bea (patch) | |
| tree | c262727ad16865ecfadabdad424b8b1f0764be8a /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
| parent | 4c0b0de904a5622c33e3ed97e86c6792fbc13feb (diff) | |
Do not create LLVM IR `constant`s for objects with dynamic initialisation
When a const-qualified object has a section attribute, that
section is set to read-only and clang outputs a LLVM IR constant
for that object. This is incorrect for dynamically initialised
objects.
For example:
int init() { return 15; }
__attribute__((section("SA")))
const int a = init();
a is allocated to a read-only section and is left
unintialised (zero-initialised).
This patch adds checks if an initialiser is a constant expression
and allocates objects to sections as follows:
* const-qualified objects
- no initialiser or constant initialiser: .rodata
- dynamic initializer: .bss
* non const-qualified objects
- no initialiser or dynamic initialiser: .bss
- constant initialiser: .data
(".rodata", ".data", and ".bss" names used just for explanatory
purpose)
Differential Revision: https://reviews.llvm.org/D102693
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
0 files changed, 0 insertions, 0 deletions
