diff options
author | Derek Schuff <dschuff@chromium.org> | 2012-11-01 13:55:17 -0700 |
---|---|---|
committer | Derek Schuff <dschuff@chromium.org> | 2012-11-01 13:55:17 -0700 |
commit | a5c3afd0e68afcca5dfabaa0850d88735e9f9493 (patch) | |
tree | b5861940aff76e5baa1d92582bc6b23ef4000ee5 /lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | 2e73bd7315e3cc621b1a49062dbad2243b6c3db0 (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.cpp | 10 |
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)); } |