summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Smith <peter.smith@linaro.org>2017-07-11 09:28:27 +0000
committerPeter Smith <peter.smith@linaro.org>2017-07-11 09:28:27 +0000
commitc1ace40bf9ed6a8972c28828444d58d16d960e07 (patch)
tree5cc429fbd738b48dadcde11b1215607832039c36
parent993f2a4299caebf36ad76fc2c1dd59f21158e6b9 (diff)
downloadbcm5719-llvm-c1ace40bf9ed6a8972c28828444d58d16d960e07.tar.gz
bcm5719-llvm-c1ace40bf9ed6a8972c28828444d58d16d960e07.zip
[ELF] Add comment to explain LinkerScript::CurAddressState [NFC]
r307367 via D34345 split out the temporary address state used within processCommands() and assignAddresses(). Due to the way that getSymbolValue is used by the ScriptParser there is no way of giving the current OutputSection to getSymbolValue() without somehow accessing the created addressState. The suggestion was that by making a pointer that would go out of scope we would find out by ASAN/MSAN or a crash if someone had misused currentAddressState. Differential Revision: https://reviews.llvm.org/D34345 llvm-svn: 307637
-rw-r--r--lld/ELF/LinkerScript.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 9f5a3696a81..532879eb31b 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -374,6 +374,10 @@ void LinkerScript::processCommands(OutputSectionFactory &Factory) {
Aether = make<OutputSection>("", 0, SHF_ALLOC);
Aether->SectionIndex = 1;
auto State = make_unique<AddressState>(Opt);
+ // CurAddressState captures the local AddressState and makes it accessible
+ // deliberately. This is needed as there are some cases where we cannot just
+ // thread the current state through to a lambda function created by the
+ // script parser.
CurAddressState = State.get();
CurAddressState->OutSec = Aether;
Dot = 0;
@@ -437,6 +441,7 @@ void LinkerScript::processCommands(OutputSectionFactory &Factory) {
}
}
}
+ CurAddressState = nullptr;
}
void LinkerScript::fabricateDefaultCommands() {
@@ -843,6 +848,10 @@ void LinkerScript::assignAddresses() {
// Assign addresses as instructed by linker script SECTIONS sub-commands.
Dot = 0;
auto State = make_unique<AddressState>(Opt);
+ // CurAddressState captures the local AddressState and makes it accessible
+ // deliberately. This is needed as there are some cases where we cannot just
+ // thread the current state through to a lambda function created by the
+ // script parser.
CurAddressState = State.get();
ErrorOnMissingSection = true;
switchTo(Aether);
@@ -861,6 +870,7 @@ void LinkerScript::assignAddresses() {
auto *Cmd = cast<OutputSectionCommand>(Base);
assignOffsets(Cmd);
}
+ CurAddressState = nullptr;
}
// Creates program headers as instructed by PHDRS linker script command.
OpenPOWER on IntegriCloud