aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/Reader/BitcodeReader.cpp
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2012-11-01 13:55:17 -0700
committerDerek Schuff <dschuff@chromium.org>2012-11-01 13:55:17 -0700
commita5c3afd0e68afcca5dfabaa0850d88735e9f9493 (patch)
treeb5861940aff76e5baa1d92582bc6b23ef4000ee5 /lib/Bitcode/Reader/BitcodeReader.cpp
parent2e73bd7315e3cc621b1a49062dbad2243b6c3db0 (diff)
Do not dematerialize functions with referencing blockAddress constants
When reduce-memory-footprint is enabled, llc attempts to dematerialize all functions once they are codegen'ed. However functions which have global blockAddress constants referring to their BBs need to be kept around, or the references will be replaced with bogus constants and not relocated. BUG=none TEST=computed_goto_test (easily reproducible by enabling -streaming-bitcde for ordinary llc) Review URL: https://codereview.chromium.org/11364028
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r--lib/Bitcode/Reader/BitcodeReader.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index ff1f35e190..96b3925ed7 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -2839,6 +2839,16 @@ bool BitcodeReader::isDematerializable(const GlobalValue *GV) const {
const Function *F = dyn_cast<Function>(GV);
if (!F || F->isDeclaration())
return false;
+ // @LOCALMOD-START
+ // Don't dematerialize functions with BBs which have their address taken;
+ // it will cause any referencing blockAddress constants to also be destroyed,
+ // but because they are GVs, they need to stay around until PassManager
+ // finalization.
+ for (Function::const_iterator BB = F->begin(); BB != F->end(); ++BB) {
+ if (BB->hasAddressTaken())
+ return false;
+ }
+ // @LOCALMOD-END
return DeferredFunctionInfo.count(const_cast<Function*>(F));
}