forked from OSchip/llvm-project
Avoid undefined behavior in LinkAllPasses.h
The LinkAllPasses.h file is included in several main programs, to force a large number of passes to be linked in. However, the ForcePassLinking constructor uses undefined behavior, since it calls member functions on `nullptr`, e.g.: ((llvm::Function*)nullptr)->viewCFGOnly(); llvm::RGPassManager RGM; ((llvm::RegionPass*)nullptr)->runOnRegion((llvm::Region*)nullptr, RGM); When the optimization level is -O2 or higher, the code below the first nullptr dereference is optimized away, and replaced by `ud2` (on x86). Therefore, the calls after that first dereference are never emitted. In my case, I noticed there was no call to `llvm::sys::RunningOnValgrind()`! Replace instances of dereferencing `nullptr` with either objects on the stack, or regular function calls. Differential Revision: http://reviews.llvm.org/D15996 llvm-svn: 257645
This commit is contained in:
parent
744959b9c9
commit
972e2c0cfb
|
@ -160,9 +160,11 @@ namespace {
|
|||
(void) llvm::createPostOrderFunctionAttrsPass();
|
||||
(void) llvm::createReversePostOrderFunctionAttrsPass();
|
||||
(void) llvm::createMergeFunctionsPass();
|
||||
(void) llvm::createPrintModulePass(*(llvm::raw_ostream*)nullptr);
|
||||
(void) llvm::createPrintFunctionPass(*(llvm::raw_ostream*)nullptr);
|
||||
(void) llvm::createPrintBasicBlockPass(*(llvm::raw_ostream*)nullptr);
|
||||
std::string buf;
|
||||
llvm::raw_string_ostream os(buf);
|
||||
(void) llvm::createPrintModulePass(os);
|
||||
(void) llvm::createPrintFunctionPass(os);
|
||||
(void) llvm::createPrintBasicBlockPass(os);
|
||||
(void) llvm::createModuleDebugInfoPrinterPass();
|
||||
(void) llvm::createPartialInliningPass();
|
||||
(void) llvm::createLintPass();
|
||||
|
@ -186,10 +188,10 @@ namespace {
|
|||
|
||||
(void)new llvm::IntervalPartition();
|
||||
(void)new llvm::ScalarEvolutionWrapperPass();
|
||||
((llvm::Function*)nullptr)->viewCFGOnly();
|
||||
llvm::Function::Create(nullptr, llvm::GlobalValue::ExternalLinkage)->viewCFGOnly();
|
||||
llvm::RGPassManager RGM;
|
||||
((llvm::RegionPass*)nullptr)->runOnRegion((llvm::Region*)nullptr, RGM);
|
||||
llvm::AliasSetTracker X(*(llvm::AliasAnalysis*)nullptr);
|
||||
llvm::AliasAnalysis AA;
|
||||
llvm::AliasSetTracker X(AA);
|
||||
X.add(nullptr, 0, llvm::AAMDNodes()); // for -print-alias-sets
|
||||
(void) llvm::AreStatisticsEnabled();
|
||||
(void) llvm::sys::RunningOnValgrind();
|
||||
|
|
Loading…
Reference in New Issue