aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineOutliner.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2022-02-23 10:15:42 -0800
committerFangrui Song <i@maskray.me>2022-02-23 10:15:42 -0800
commitfc0aa8424ca98da29a9c7aa15b4427d47504ba87 (patch)
treed7b839e39899f6f98d2ac1709d37358c4649242e /llvm/lib/CodeGen/MachineOutliner.cpp
parentb3a778fb5eca0e6032f3d62c03a673c2431be8a0 (diff)
downloadllvm-fc0aa8424ca98da29a9c7aa15b4427d47504ba87.zip
llvm-fc0aa8424ca98da29a9c7aa15b4427d47504ba87.tar.gz
llvm-fc0aa8424ca98da29a9c7aa15b4427d47504ba87.tar.bz2
[ELF] Check COMMON symbols for PROVIDE and don't redefine COMMON symbols edata/end/etext
In GNU ld, the definition precedence is: regular symbol assignment > relocatable object definition > `PROVIDE` symbol assignment. GNU ld's internal linker scripts define the non-reserved (by C and C++) edata/end/etext with `PROVIDE` so the relocatable object definition takes precedence. This makes sense because `int end;` is valid. We currently redefine such symbols if they are COMMON, but not if they are regular definitions, so `int end;` with -fcommon is essentially a UB in ld.lld. Fix this (also improve consistency and match GNU ld) by using the `isDefined` code path for `isCommon`. In GNU ld, reserved identifiers like `__ehdr_start` do not use `PROVIDE`, while we treat them all as `PROVIDE`, this seems fine. Reviewed By: peter.smith Differential Revision: https://reviews.llvm.org/D120389
Diffstat (limited to 'llvm/lib/CodeGen/MachineOutliner.cpp')
0 files changed, 0 insertions, 0 deletions