[PATCH] D23196: [ARM] Command-line options for embedded position-independent code
Oliver Stannard via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 5 03:35:17 PDT 2016
olista01 created this revision.
olista01 added reviewers: t.p.northover, rengolin, srhines, weimingz.
olista01 added a subscriber: cfe-commits.
olista01 set the repository for this revision to rL LLVM.
Herald added subscribers: samparker, rengolin, aemerson.
This patch (with the corresponding ARM backend patch) adds support for
some new relocation models:
- Read-only position independence (ROPI): Code and read-only data is
accessed PC-relative. The offsets between all code and RO data
sections are known at static link time.
- Read-write position independence (RWPI): Read-write data is accessed
relative to a static base register. The offsets between all writeable
data sections are known at static link time.
These two modes are independent (they specify how different objects
should be addressed), so they can be used individually or together.
These modes are intended for bare-metal systems or systems with small
real-time operating systems. They are designed to avoid the need for a
dynamic linker, the only initialisation required is setting the static
base register to an appropriate value for RWPI code.
There is one C construct not currently supported by these modes: global
variables initialised to the address of another global variable or
function, where that address is not known at static-link time. There are
a few possible ways to solve this:
- Disallow this, and require the user to write their own initialisation
function if they need variables like this.
- Emit dynamic initialisers for these variables in the compiler, called
from the .init_array section (as is currently done for C++ dynamic
initialisers). We have a patch to do this, described in my original RFC
email (http://lists.llvm.org/pipermail/llvm-dev/2015-December/093022.html),
but the feedback from that RFC thread was that this is not something
that belongs in clang.
- Use a small dynamic loader to fix up these variables, by adding the
difference between the load and execution address of the relevant
section. This would require linker co-operation to generate a table of
addresses that need fixing up.
Repository:
rL LLVM
https://reviews.llvm.org/D23196
Files:
include/clang/Basic/DiagnosticDriverKinds.td
include/clang/Driver/Options.td
lib/CodeGen/BackendUtil.cpp
lib/Driver/Tools.cpp
test/Driver/ropi-rwpi.c
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23196.66921.patch
Type: text/x-patch
Size: 7663 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160805/8b47c624/attachment-0001.bin>
More information about the cfe-commits
mailing list