[llvm] r344274 - [PassManager/Sanitizer] Port of AddresSanitizer pass from legacy to new PassManager

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 23 17:21:39 PDT 2018


FWIW this is really increasing compile time of asan instrumented code with
the new pass manager. We're looking, but sending a message just in case
someone is aware here.

On Tue, Oct 16, 2018 at 5:23 PM Leonard Chan via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> No problem. Also looked into the tests for a bit.
>
> For atomic_ops.c, it seems that the test just needs to ignore or XFAIL
> for this target since the test just assumes all targets (except for
> hexagon and sparc) will have native atomic load support (ie load
> atomic vs call void @__atomic_load).
>
> For illegal-UTF8.m, I don't know objective C very well, but I think
> it's a similar issue where there is an unsupported feature for this
> target and it should be ignored/XFAIL'd also.
>
> And for the go test, I don't know what that is or why it's broken :p.
>
> - LeonardLooked into the remaining tests a bit. From what I can tell,
> it just seems like On Tue, Oct 16, 2018 at 4:47 PM Leonard Chan
> <leonardchan at google.com> wrote:
> >
> > I created a patch that has the fix and added you as a reviewer:
> > https://reviews.llvm.org/D53350
> >
> > This should fix all of the tests related to ASan, but I'm still unsure
> > about the remaining failing tests. For me, building with your cmake
> > invocation, I ended up with the following 18 errors:
> >
> >    Clang :: CodeGen/address-safety-attr-flavors.cpp
> >     Clang :: CodeGen/address-safety-attr.cpp
> >     Clang :: CodeGen/address-sanitizer-and-array-cookie.cpp
> >     Clang :: CodeGen/asan-globals-gc.cpp
> >     Clang :: CodeGen/asan-globals.cpp
> >     Clang :: CodeGen/asan-no-globals-no-comdat.cpp
> >     Clang :: CodeGen/atomic_ops.c
> >     Clang :: CodeGen/lifetime-asan.c
> >     Clang :: CodeGen/sanitize-address-field-padding.cpp
> >     Clang :: CodeGen/sanitize-init-order.cpp
> >     Clang :: CodeGenCXX/catch-undef-behavior.cpp
> >     Clang :: CodeGenCXX/finegrain-bitfield-access.cpp
> >     Clang :: CodeGenCXX/lifetime-asan.cpp
> >     Clang :: CodeGenObjC/illegal-UTF8.m
> >     Clang :: CodeGenObjC/no-sanitize.m
> >     Clang :: CodeGenObjCXX/address-safety-attr.mm
> >     Clang :: Driver/asan.c
> >     LLVM :: Bindings/Go/go.test
> >
> > of which, I was able to fix 15 with the fix in the patch. Although these
> 3,
> >
> >     Clang :: CodeGen/atomic_ops.c
> >     Clang :: CodeGenObjC/illegal-UTF8.m
> >     LLVM :: Bindings/Go/go.test
> >
> > are still broken. I don't think they have to do with my ASan patch,
> > but I'll still look into them for a bit.
> >
> > - Leonard
> > On Tue, Oct 16, 2018 at 2:35 PM Leonard Chan <leonardchan at google.com>
> wrote:
> > >
> > > I will take a look. Thanks for bringing this up.
> > >
> > > - Leonard
> > > On Tue, Oct 16, 2018 at 2:21 PM <douglas.yung at sony.com> wrote:
> > > >
> > > > Hi Leonard,
> > > >
> > > > I encountered some test issues after attempting to build/test your
> changes on my local machine. I built on my linux machine your change with
> an ARM target and hit the following failure in multiple tests:
> > > >
> > > > FAIL: Clang :: CodeGen/address-safety-attr-flavors.cpp (5007 of
> 42408)
> > > > ******************** TEST 'Clang ::
> CodeGen/address-safety-attr-flavors.cpp' FAILED ********************
> > > > Script:
> > > > --
> > > > : 'RUN: at line 8';
>  /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -disable-O0-optnone
> -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> | /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-NOASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > : 'RUN: at line 11';
>  /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -fsanitize=address
> -disable-O0-optnone -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> |    /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-ASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > : 'RUN: at line 15';
>  /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -fsanitize=kernel-address
> -disable-O0-optnone -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> |    /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-KASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > : 'RUN: at line 19';
>  /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -fsanitize=hwaddress
> -disable-O0-optnone -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> |    /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-HWASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > : 'RUN: at line 23';
>  /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -fsanitize=kernel-hwaddress
> -disable-O0-optnone -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> |    /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-KHWASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > --
> > > > Exit Code: 2
> > > >
> > > > Command Output (stderr):
> > > > --
> > > > Pass 'AddressSanitizerFunctionPass' is not initialized.
> > > > Verify if there is a pass dependency cycle.
> > > > Required Passes:
> > > > clang:
> /home/dyung/src/upstream/llvm_clean/lib/IR/LegacyPassManager.cpp:753: void
> llvm::PMTopLevelManager::schedulePass(llvm::Pass *): Assertion `PI &&
> "Expected required passes to be initialized"' failed.
> > > > Stack dump:
> > > > 0.      Program arguments:
> /home/dyung/src/upstream/344274-linux-arm/bin/clang -cc1 -internal-isystem
> /home/dyung/src/upstream/344274-linux-arm/lib/clang/8.0.0/include
> -nostdsysteminc -triple i386-unknown-linux -fsanitize=address
> -disable-O0-optnone -emit-llvm -o -
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > > 1.      <eof> parser at end of file
> > > > #0 0x00000000014eec94 PrintStackTraceSignalHandler(void*)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x14eec94)
> > > > #1 0x00000000014ecb3e llvm::sys::RunSignalHandlers()
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x14ecb3e)
> > > > #2 0x00000000014eee52 SignalHandler(int)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x14eee52)
> > > > #3 0x00007fb98dfb5330 __restore_rt
> (/lib/x86_64-linux-gnu/libpthread.so.0+0x10330)
> > > > #4 0x00007fb98cdadc37 gsignal
> (/lib/x86_64-linux-gnu/libc.so.6+0x36c37)
> > > > #5 0x00007fb98cdb1028 abort (/lib/x86_64-linux-gnu/libc.so.6+0x3a028)
> > > > #6 0x00007fb98cda6bf6 (/lib/x86_64-linux-gnu/libc.so.6+0x2fbf6)
> > > > #7 0x00007fb98cda6ca2 (/lib/x86_64-linux-gnu/libc.so.6+0x2fca2)
> > > > #8 0x0000000000fe7079
> llvm::PMTopLevelManager::schedulePass(llvm::Pass*)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0xfe7079)
> > > > #9 0x00000000016ba2a0
> addAddressSanitizerPasses(llvm::PassManagerBuilder const&,
> llvm::legacy::PassManagerBase&)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x16ba2a0)
> > > > #10 0x0000000001fe7b9d
> llvm::PassManagerBuilder::addExtensionsToPM(llvm::PassManagerBuilder::ExtensionPointTy,
> llvm::legacy::PassManagerBase&) const
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1fe7b9d)
> > > > #11 0x0000000001fe8f9f
> llvm::PassManagerBuilder::populateModulePassManager(llvm::legacy::PassManagerBase&)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1fe8f9f)
> > > > #12 0x00000000016ae09a
> clang::EmitBackendOutput(clang::DiagnosticsEngine&,
> clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
> clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout
> const&, llvm::Module*, clang::BackendAction,
> std::unique_ptr<llvm::raw_pwrite_stream,
> std::default_delete<llvm::raw_pwrite_stream> >)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x16ae09a)
> > > > #13 0x0000000001f0b4bf
> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1f0b4bf)
> > > > #14 0x000000000279e283 clang::ParseAST(clang::Sema&, bool, bool)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x279e283)
> > > > #15 0x0000000001b792e0 clang::FrontendAction::Execute()
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1b792e0)
> > > > #16 0x0000000001b208b1
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1b208b1)
> > > > #17 0x0000000001c19ca9
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x1c19ca9)
> > > > #18 0x00000000007efbe2 cc1_main(llvm::ArrayRef<char const*>, char
> const*, void*)
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x7efbe2)
> > > > #19 0x00000000007ed57a main
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x7ed57a)
> > > > #20 0x00007fb98cd98f45 __libc_start_main
> (/lib/x86_64-linux-gnu/libc.so.6+0x21f45)
> > > > #21 0x00000000007ea4ed _start
> (/home/dyung/src/upstream/344274-linux-arm/bin/clang+0x7ea4ed)
> > > > FileCheck error: '-' is empty.
> > > > FileCheck command line:
> /home/dyung/src/upstream/344274-linux-arm/bin/FileCheck
> -check-prefix=CHECK-ASAN
> /home/dyung/src/upstream/llvm_clean/tools/clang/test/CodeGen/address-safety-attr-flavors.cpp
> > > >
> > > > I build using a script which issues the following commands:
> > > >
> > > > 1. cmake -G Ninja -DLLVM_BUILD_RUNTIME=OFF
> -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_TIMESTAMPS=OFF
> -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_OPTIMIZED_TABLEGEN=ON
> -DLLVM_VERSION_SUFFIX= -DLLVM_TARGETS_TO_BUILD=ARM
> -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf -DLLVM_LIT_ARGS=--verbose
> -j80 --no-progress-bar -DCMAKE_BUILD_TYPE=Release <path to LLVM sources>
> -DLLVM_TOOL_LLD_BUILD=OFF
> > > >
> > > > 2. ninja all
> > > > 3. ninja check-all
> > > >
> > > > This builds and tests the compiler, and when the testing finishes,
> 14 of the 19 failures are for the reason above. Can you take a look?
> > > >
> > > > Douglas Yung
> > > >
> > > > > -----Original Message-----
> > > > > From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
> > > > > Behalf Of Leonard Chan via llvm-commits
> > > > > Sent: Thursday, October 11, 2018 11:32
> > > > > To: llvm-commits at lists.llvm.org
> > > > > Subject: [llvm] r344274 - [PassManager/Sanitizer] Port of
> > > > > AddresSanitizer pass from legacy to new PassManager
> > > > >
> > > > > Author: leonardchan
> > > > > Date: Thu Oct 11 11:31:51 2018
> > > > > New Revision: 344274
> > > > >
> > > > > URL: http://llvm.org/viewvc/llvm-project?rev=344274&view=rev
> > > > > Log:
> > > > > [PassManager/Sanitizer] Port of AddresSanitizer pass from legacy
> to new
> > > > > PassManager
> > > > >
> > > > > This patch ports the legacy pass manager to the new one to take
> > > > > advantage of
> > > > > the benefits of the new PM. This involved moving a lot of the
> > > > > declarations for
> > > > > `AddressSantizer` to a header so that it can be publicly used via
> > > > > PassRegistry.def which I believe contains all the passes managed
> by the
> > > > > new PM.
> > > > >
> > > > > This patch essentially decouples the instrumentation from the
> legacy PM
> > > > > such
> > > > > hat it can be used by both legacy and new PM infrastructure.
> > > > >
> > > > > Differential Revision: https://reviews.llvm.org/D52739
> > > > >
> > > > > Added:
> > > > >
> > > > >
> llvm/trunk/include/llvm/Transforms/Instrumentation/AddressSanitizerPass
> > > > > .h
> > > > > Modified:
> > > > >     llvm/trunk/include/llvm/InitializePasses.h
> > > > >     llvm/trunk/lib/Passes/PassBuilder.cpp
> > > > >     llvm/trunk/lib/Passes/PassRegistry.def
> > > > >     llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> > > > >     llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> > > > >     llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
> > > > >
> > > > > Modified: llvm/trunk/include/llvm/InitializePasses.h
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/include/llvm/InitializePasses.h?rev=344274&r1=344273
> > > > > &r2=344274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/include/llvm/InitializePasses.h (original)
> > > > > +++ llvm/trunk/include/llvm/InitializePasses.h Thu Oct 11 11:31:51
> 2018
> > > > > @@ -65,8 +65,8 @@ void initializeAAEvalLegacyPassPass(Pass
> > > > >  void initializeAAResultsWrapperPassPass(PassRegistry&);
> > > > >  void initializeADCELegacyPassPass(PassRegistry&);
> > > > >  void initializeAddDiscriminatorsLegacyPassPass(PassRegistry&);
> > > > > -void initializeAddressSanitizerModulePass(PassRegistry&);
> > > > > -void initializeAddressSanitizerPass(PassRegistry&);
> > > > > +void initializeAddressSanitizerModuleLegacyPassPass(PassRegistry
> &);
> > > > > +void initializeAddressSanitizerLegacyPassPass(PassRegistry &);
> > > > >  void
> initializeAggressiveInstCombinerLegacyPassPass(PassRegistry&);
> > > > >  void initializeAliasSetPrinterPass(PassRegistry&);
> > > > >  void initializeAlignmentFromAssumptionsPass(PassRegistry&);
> > > > >
> > > > > Added:
> > > > >
> llvm/trunk/include/llvm/Transforms/Instrumentation/AddressSanitizerPass
> > > > > .h
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/include/llvm/Transforms/Instrumentation/AddressSanit
> > > > > izerPass.h?rev=344274&view=auto
> > > > >
> =======================================================================
> > > > > =======
> > > > > ---
> > > > >
> llvm/trunk/include/llvm/Transforms/Instrumentation/AddressSanitizerPass
> > > > > .h (added)
> > > > > +++
> > > > >
> llvm/trunk/include/llvm/Transforms/Instrumentation/AddressSanitizerPass
> > > > > .h Thu Oct 11 11:31:51 2018
> > > > > @@ -0,0 +1,41 @@
> > > > > +//===--------- Definition of the AddressSanitizer class
> ---------*-
> > > > > C++ -*-===//
> > > > > +//
> > > > > +//                     The LLVM Compiler Infrastructure
> > > > > +//
> > > > > +// This file is distributed under the University of Illinois Open
> > > > > Source
> > > > > +// License. See LICENSE.TXT for details.
> > > > > +//
> > > > >
> +//===-----------------------------------------------------------------
> > > > > -----===//
> > > > > +//
> > > > > +// This file declares the AddressSanitizer class which is a port
> of
> > > > > the legacy
> > > > > +// AddressSanitizer pass to use the new PassManager
> infrastructure.
> > > > > +//
> > > > >
> +//===-----------------------------------------------------------------
> > > > > -----===//
> > > > > +#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_ADDRESSSANITIZERPASS_H
> > > > > +#define LLVM_TRANSFORMS_INSTRUMENTATION_ADDRESSSANITIZERPASS_H
> > > > > +
> > > > > +#include "llvm/IR/Function.h"
> > > > > +#include "llvm/IR/Module.h"
> > > > > +#include "llvm/IR/PassManager.h"
> > > > > +
> > > > > +namespace llvm {
> > > > > +
> > > > > +/// Public interface to the address sanitizer pass for
> instrumenting
> > > > > code to
> > > > > +/// check for various memory bugs.
> > > > > +class AddressSanitizerPass : public
> > > > > PassInfoMixin<AddressSanitizerPass> {
> > > > > +public:
> > > > > +  explicit AddressSanitizerPass(bool CompileKernel = false,
> > > > > +                                bool Recover = false,
> > > > > +                                bool UseAfterScope = false);
> > > > > +  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
> > > > > +  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
> > > > > +
> > > > > +private:
> > > > > +  bool CompileKernel;
> > > > > +  bool Recover;
> > > > > +  bool UseAfterScope;
> > > > > +};
> > > > > +
> > > > > +} // namespace llvm
> > > > > +
> > > > > +#endif
> > > > >
> > > > > Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=344274&r1=344273&r2=3
> > > > > 44274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> > > > > +++ llvm/trunk/lib/Passes/PassBuilder.cpp Thu Oct 11 11:31:51 2018
> > > > > @@ -61,7 +61,6 @@
> > > > >  #include "llvm/Support/Regex.h"
> > > > >  #include "llvm/Target/TargetMachine.h"
> > > > >  #include
> > > > > "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h"
> > > > > -#include "llvm/Transforms/Instrumentation/CGProfile.h"
> > > > >  #include "llvm/Transforms/IPO/AlwaysInliner.h"
> > > > >  #include "llvm/Transforms/IPO/ArgumentPromotion.h"
> > > > >  #include "llvm/Transforms/IPO/CalledValuePropagation.h"
> > > > > @@ -87,7 +86,9 @@
> > > > >  #include "llvm/Transforms/IPO/SyntheticCountsPropagation.h"
> > > > >  #include "llvm/Transforms/IPO/WholeProgramDevirt.h"
> > > > >  #include "llvm/Transforms/InstCombine/InstCombine.h"
> > > > > +#include "llvm/Transforms/Instrumentation/AddressSanitizerPass.h"
> > > > >  #include "llvm/Transforms/Instrumentation/BoundsChecking.h"
> > > > > +#include "llvm/Transforms/Instrumentation/CGProfile.h"
> > > > >  #include
> "llvm/Transforms/Instrumentation/ControlHeightReduction.h"
> > > > >  #include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
> > > > >  #include "llvm/Transforms/Instrumentation/InstrProfiling.h"
> > > > >
> > > > > Modified: llvm/trunk/lib/Passes/PassRegistry.def
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/lib/Passes/PassRegistry.def?rev=344274&r1=344273&r2=
> > > > > 344274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> > > > > +++ llvm/trunk/lib/Passes/PassRegistry.def Thu Oct 11 11:31:51 2018
> > > > > @@ -40,6 +40,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", Glob
> > > > >  #define MODULE_PASS(NAME, CREATE_PASS)
> > > > >  #endif
> > > > >  MODULE_PASS("always-inline", AlwaysInlinerPass())
> > > > > +MODULE_PASS("asan", AddressSanitizerPass(false, false, true))
> > > > >  MODULE_PASS("called-value-propagation",
> CalledValuePropagationPass())
> > > > >  MODULE_PASS("cg-profile", CGProfilePass())
> > > > >  MODULE_PASS("constmerge", ConstantMergePass())
> > > > > @@ -147,6 +148,7 @@ FUNCTION_PASS("adce", ADCEPass())
> > > > >  FUNCTION_PASS("add-discriminators", AddDiscriminatorsPass())
> > > > >  FUNCTION_PASS("aggressive-instcombine",
> AggressiveInstCombinePass())
> > > > >  FUNCTION_PASS("alignment-from-assumptions",
> > > > > AlignmentFromAssumptionsPass())
> > > > > +FUNCTION_PASS("asan", AddressSanitizerPass(false, false, false))
> > > > >  FUNCTION_PASS("bdce", BDCEPass())
> > > > >  FUNCTION_PASS("bounds-checking", BoundsCheckingPass())
> > > > >  FUNCTION_PASS("break-crit-edges", BreakCriticalEdgesPass())
> > > > >
> > > > > Modified:
> > > > > llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?
> > > > > rev=344274&r1=344273&r2=344274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> > > > > (original)
> > > > > +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> Thu
> > > > > Oct 11 11:31:51 2018
> > > > > @@ -25,7 +25,6 @@
> > > > >  #include "llvm/ADT/Twine.h"
> > > > >  #include "llvm/Analysis/MemoryBuiltins.h"
> > > > >  #include "llvm/Analysis/TargetLibraryInfo.h"
> > > > > -#include "llvm/Transforms/Utils/Local.h"
> > > > >  #include "llvm/Analysis/ValueTracking.h"
> > > > >  #include "llvm/BinaryFormat/MachO.h"
> > > > >  #include "llvm/IR/Argument.h"
> > > > > @@ -70,8 +69,10 @@
> > > > >  #include "llvm/Support/ScopedPrinter.h"
> > > > >  #include "llvm/Support/raw_ostream.h"
> > > > >  #include "llvm/Transforms/Instrumentation.h"
> > > > > +#include "llvm/Transforms/Instrumentation/AddressSanitizerPass.h"
> > > > >  #include "llvm/Transforms/Utils/ASanStackFrameLayout.h"
> > > > >  #include "llvm/Transforms/Utils/BasicBlockUtils.h"
> > > > > +#include "llvm/Transforms/Utils/Local.h"
> > > > >  #include "llvm/Transforms/Utils/ModuleUtils.h"
> > > > >  #include "llvm/Transforms/Utils/PromoteMemToReg.h"
> > > > >  #include <algorithm>
> > > > > @@ -597,26 +598,22 @@ static size_t RedzoneSizeForScale(int Ma
> > > > >  namespace {
> > > > >
> > > > >  /// AddressSanitizer: instrument the code in module to find memory
> > > > > bugs.
> > > > > -struct AddressSanitizer : public FunctionPass {
> > > > > -  // Pass identification, replacement for typeid
> > > > > -  static char ID;
> > > > > -
> > > > > -  explicit AddressSanitizer(bool CompileKernel = false, bool
> Recover =
> > > > > false,
> > > > > +struct AddressSanitizer {
> > > > > +  explicit AddressSanitizer(Module &M, DominatorTree *DT,
> > > > > +                            bool CompileKernel = false, bool
> Recover =
> > > > > false,
> > > > >                              bool UseAfterScope = false)
> > > > > -      : FunctionPass(ID), UseAfterScope(UseAfterScope ||
> > > > > ClUseAfterScope) {
> > > > > +      : UseAfterScope(UseAfterScope || ClUseAfterScope), DT(DT) {
> > > > >      this->Recover = ClRecover.getNumOccurrences() > 0 ? ClRecover
> :
> > > > > Recover;
> > > > >      this->CompileKernel = ClEnableKasan.getNumOccurrences() > 0 ?
> > > > >          ClEnableKasan : CompileKernel;
> > > > > -
> initializeAddressSanitizerPass(*PassRegistry::getPassRegistry());
> > > > > -  }
> > > > >
> > > > > -  StringRef getPassName() const override {
> > > > > -    return "AddressSanitizerFunctionPass";
> > > > > -  }
> > > > > -
> > > > > -  void getAnalysisUsage(AnalysisUsage &AU) const override {
> > > > > -    AU.addRequired<DominatorTreeWrapperPass>();
> > > > > -    AU.addRequired<TargetLibraryInfoWrapperPass>();
> > > > > +    // Initialize the private fields. No one has accessed them
> before.
> > > > > +    GlobalsMD.init(M);
> > > > > +    C = &(M.getContext());
> > > > > +    LongSize = M.getDataLayout().getPointerSizeInBits();
> > > > > +    IntptrTy = Type::getIntNTy(*C, LongSize);
> > > > > +    TargetTriple = Triple(M.getTargetTriple());
> > > > > +    Mapping = getShadowMapping(TargetTriple, LongSize,
> CompileKernel);
> > > > >    }
> > > > >
> > > > >    uint64_t getAllocaSizeInBytes(const AllocaInst &AI) const {
> > > > > @@ -661,12 +658,12 @@ struct AddressSanitizer : public Functio
> > > > >                                   Value *SizeArgument, uint32_t
> Exp);
> > > > >    void instrumentMemIntrinsic(MemIntrinsic *MI);
> > > > >    Value *memToShadow(Value *Shadow, IRBuilder<> &IRB);
> > > > > -  bool runOnFunction(Function &F) override;
> > > > >    bool maybeInsertAsanInitAtFunctionEntry(Function &F);
> > > > >    void maybeInsertDynamicShadowAtFunctionEntry(Function &F);
> > > > >    void markEscapedLocalAllocas(Function &F);
> > > > > -  bool doInitialization(Module &M) override;
> > > > > -  bool doFinalization(Module &M) override;
> > > > > +
> > > > > +  /// Return true if the function changed.
> > > > > +  bool instrument(Function &F, const TargetLibraryInfo *TLI);
> > > > >
> > > > >    DominatorTree &getDominatorTree() const { return *DT; }
> > > > >
> > > > > @@ -724,16 +721,12 @@ private:
> > > > >    DenseMap<const AllocaInst *, bool> ProcessedAllocas;
> > > > >  };
> > > > >
> > > > > -class AddressSanitizerModule : public ModulePass {
> > > > > +class AddressSanitizerModule {
> > > > >  public:
> > > > > -  // Pass identification, replacement for typeid
> > > > > -  static char ID;
> > > > > -
> > > > >    explicit AddressSanitizerModule(bool CompileKernel = false,
> > > > >                                    bool Recover = false,
> > > > >                                    bool UseGlobalsGC = true)
> > > > > -      : ModulePass(ID),
> > > > > -        UseGlobalsGC(UseGlobalsGC && ClUseGlobalsGC),
> > > > > +      : UseGlobalsGC(UseGlobalsGC && ClUseGlobalsGC),
> > > > >          // Not a typo: ClWithComdat is almost completely pointless
> > > > > without
> > > > >          // ClUseGlobalsGC (because then it only works on modules
> > > > > without
> > > > >          // globals, which are rare); it is a prerequisite for
> > > > > ClUseGlobalsGC;
> > > > > @@ -742,14 +735,12 @@ public:
> > > > >          // ClWithComdat and ClUseGlobalsGC unless the frontend
> says
> > > > > it's ok to
> > > > >          // do globals-gc.
> > > > >          UseCtorComdat(UseGlobalsGC && ClWithComdat) {
> > > > > -          this->Recover = ClRecover.getNumOccurrences() > 0 ?
> > > > > -              ClRecover : Recover;
> > > > > -          this->CompileKernel = ClEnableKasan.getNumOccurrences()
> > 0
> > > > > ?
> > > > > -              ClEnableKasan : CompileKernel;
> > > > > -     }
> > > > > +    this->Recover = ClRecover.getNumOccurrences() > 0 ? ClRecover
> :
> > > > > Recover;
> > > > > +    this->CompileKernel =
> > > > > +        ClEnableKasan.getNumOccurrences() > 0 ? ClEnableKasan :
> > > > > CompileKernel;
> > > > > +  }
> > > > >
> > > > > -  bool runOnModule(Module &M) override;
> > > > > -  StringRef getPassName() const override { return
> > > > > "AddressSanitizerModule"; }
> > > > > +  bool instrument(Module &M);
> > > > >
> > > > >  private:
> > > > >    void initializeCallbacks(Module &M);
> > > > > @@ -1057,18 +1048,100 @@ struct FunctionStackPoisoner : public In
> > > > >                       Instruction *ThenTerm, Value *ValueIfFalse);
> > > > >  };
> > > > >
> > > > > +class AddressSanitizerLegacyPass : public FunctionPass {
> > > > > +public:
> > > > > +  static char ID;
> > > > > +
> > > > > +  explicit AddressSanitizerLegacyPass(bool CompileKernel = false,
> > > > > +                                      bool Recover = false,
> > > > > +                                      bool UseAfterScope = false)
> > > > > +      : FunctionPass(ID), CompileKernel(CompileKernel),
> > > > > Recover(Recover),
> > > > > +        UseAfterScope(UseAfterScope) {}
> > > > > +
> > > > > +  StringRef getPassName() const override {
> > > > > +    return "AddressSanitizerFunctionPass";
> > > > > +  }
> > > > > +
> > > > > +  void getAnalysisUsage(AnalysisUsage &AU) const override {
> > > > > +    AU.addRequired<DominatorTreeWrapperPass>();
> > > > > +    AU.addRequired<TargetLibraryInfoWrapperPass>();
> > > > > +  }
> > > > > +
> > > > > +  bool runOnFunction(Function &F) override {
> > > > > +    DominatorTree *DTree =
> > > > > +        &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
> > > > > +    const TargetLibraryInfo *TLI =
> > > > > +        &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
> > > > > +    AddressSanitizer Sanitizer(*F.getParent(), DTree,
> CompileKernel,
> > > > > Recover,
> > > > > +                               UseAfterScope);
> > > > > +    return Sanitizer.instrument(F, TLI);
> > > > > +  }
> > > > > +
> > > > > +private:
> > > > > +  bool CompileKernel;
> > > > > +  bool Recover;
> > > > > +  bool UseAfterScope;
> > > > > +};
> > > > > +
> > > > > +class AddressSanitizerModuleLegacyPass : public ModulePass {
> > > > > +public:
> > > > > +  static char ID;
> > > > > +
> > > > > +  explicit AddressSanitizerModuleLegacyPass(bool CompileKernel =
> > > > > false,
> > > > > +                                            bool Recover = false,
> > > > > +                                            bool UseAfterScope =
> true)
> > > > > +      : ModulePass(ID), CompileKernel(CompileKernel),
> > > > > Recover(Recover),
> > > > > +        UseAfterScope(UseAfterScope) {}
> > > > > +
> > > > > +  StringRef getPassName() const override { return
> > > > > "AddressSanitizerModule"; }
> > > > > +
> > > > > +  bool runOnModule(Module &M) override {
> > > > > +    AddressSanitizerModule Sanitizer(CompileKernel, Recover,
> > > > > UseAfterScope);
> > > > > +    return Sanitizer.instrument(M);
> > > > > +  }
> > > > > +
> > > > > +private:
> > > > > +  bool CompileKernel;
> > > > > +  bool Recover;
> > > > > +  bool UseAfterScope;
> > > > > +};
> > > > > +
> > > > >  } // end anonymous namespace
> > > > >
> > > > > -char AddressSanitizer::ID = 0;
> > > > > +AddressSanitizerPass::AddressSanitizerPass(bool CompileKernel,
> bool
> > > > > Recover,
> > > > > +                                           bool UseAfterScope)
> > > > > +    : CompileKernel(CompileKernel), Recover(Recover),
> > > > > +      UseAfterScope(UseAfterScope) {}
> > > > > +
> > > > > +PreservedAnalyses AddressSanitizerPass::run(Function &F,
> > > > > +
> AnalysisManager<Function>
> > > > > &AM) {
> > > > > +  DominatorTree *DT = &AM.getResult<DominatorTreeAnalysis>(F);
> > > > > +  const TargetLibraryInfo *TLI =
> > > > > &AM.getResult<TargetLibraryAnalysis>(F);
> > > > > +  AddressSanitizer Sanitizer(*F.getParent(), DT, CompileKernel,
> > > > > Recover,
> > > > > +                             UseAfterScope);
> > > > > +  if (Sanitizer.instrument(F, TLI))
> > > > > +    return PreservedAnalyses::none();
> > > > > +  return PreservedAnalyses::all();
> > > > > +}
> > > > > +
> > > > > +PreservedAnalyses AddressSanitizerPass::run(Module &M,
> > > > > +
> AnalysisManager<Module>
> > > > > &AM) {
> > > > > +  AddressSanitizerModule Sanitizer(CompileKernel, Recover,
> > > > > UseAfterScope);
> > > > > +  if (Sanitizer.instrument(M))
> > > > > +    return PreservedAnalyses::none();
> > > > > +  return PreservedAnalyses::all();
> > > > > +}
> > > > > +
> > > > > +char AddressSanitizerLegacyPass::ID = 0;
> > > > >
> > > > >  INITIALIZE_PASS_BEGIN(
> > > > > -    AddressSanitizer, "asan",
> > > > > +    AddressSanitizerLegacyPass, "asan",
> > > > >      "AddressSanitizer: detects use-after-free and out-of-bounds
> > > > > bugs.", false,
> > > > >      false)
> > > > >  INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
> > > > >  INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
> > > > >  INITIALIZE_PASS_END(
> > > > > -    AddressSanitizer, "asan",
> > > > > +    AddressSanitizerLegacyPass, "asan",
> > > > >      "AddressSanitizer: detects use-after-free and out-of-bounds
> > > > > bugs.", false,
> > > > >      false)
> > > > >
> > > > > @@ -1076,13 +1149,13 @@ FunctionPass *llvm::createAddressSanitiz
> > > > >                                                         bool
> Recover,
> > > > >                                                         bool
> > > > > UseAfterScope) {
> > > > >    assert(!CompileKernel || Recover);
> > > > > -  return new AddressSanitizer(CompileKernel, Recover,
> UseAfterScope);
> > > > > +  return new AddressSanitizerLegacyPass(CompileKernel, Recover,
> > > > > UseAfterScope);
> > > > >  }
> > > > >
> > > > > -char AddressSanitizerModule::ID = 0;
> > > > > +char AddressSanitizerModuleLegacyPass::ID = 0;
> > > > >
> > > > >  INITIALIZE_PASS(
> > > > > -    AddressSanitizerModule, "asan-module",
> > > > > +    AddressSanitizerModuleLegacyPass, "asan-module",
> > > > >      "AddressSanitizer: detects use-after-free and out-of-bounds
> bugs."
> > > > >      "ModulePass",
> > > > >      false, false)
> > > > > @@ -1091,7 +1164,8 @@ ModulePass *llvm::createAddressSanitizer
> > > > >                                                     bool Recover,
> > > > >                                                     bool
> UseGlobalsGC)
> > > > > {
> > > > >    assert(!CompileKernel || Recover);
> > > > > -  return new AddressSanitizerModule(CompileKernel, Recover,
> > > > > UseGlobalsGC);
> > > > > +  return new AddressSanitizerModuleLegacyPass(CompileKernel,
> Recover,
> > > > > +                                              UseGlobalsGC);
> > > > >  }
> > > > >
> > > > >  static size_t TypeSizeToSizeIndex(uint32_t TypeSize) {
> > > > > @@ -2268,7 +2342,7 @@ int AddressSanitizerModule::GetAsanVersi
> > > > >    return Version;
> > > > >  }
> > > > >
> > > > > -bool AddressSanitizerModule::runOnModule(Module &M) {
> > > > > +bool AddressSanitizerModule::instrument(Module &M) {
> > > > >    C = &(M.getContext());
> > > > >    int LongSize = M.getDataLayout().getPointerSizeInBits();
> > > > >    IntptrTy = Type::getIntNTy(*C, LongSize);
> > > > > @@ -2387,25 +2461,6 @@ void AddressSanitizer::initializeCallbac
> > > > >
> > > > > ArrayType::get(IRB.getInt8Ty(), 0));
> > > > >  }
> > > > >
> > > > > -// virtual
> > > > > -bool AddressSanitizer::doInitialization(Module &M) {
> > > > > -  // Initialize the private fields. No one has accessed them
> before.
> > > > > -  GlobalsMD.init(M);
> > > > > -
> > > > > -  C = &(M.getContext());
> > > > > -  LongSize = M.getDataLayout().getPointerSizeInBits();
> > > > > -  IntptrTy = Type::getIntNTy(*C, LongSize);
> > > > > -  TargetTriple = Triple(M.getTargetTriple());
> > > > > -
> > > > > -  Mapping = getShadowMapping(TargetTriple, LongSize,
> CompileKernel);
> > > > > -  return true;
> > > > > -}
> > > > > -
> > > > > -bool AddressSanitizer::doFinalization(Module &M) {
> > > > > -  GlobalsMD.reset();
> > > > > -  return false;
> > > > > -}
> > > > > -
> > > > >  bool
> AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F)
> > > > > {
> > > > >    // For each NSObject descendant having a +load method, this
> method
> > > > > is invoked
> > > > >    // by the ObjC runtime before any of the static constructors is
> > > > > called.
> > > > > @@ -2479,7 +2534,7 @@ void AddressSanitizer::markEscapedLocalA
> > > > >    }
> > > > >  }
> > > > >
> > > > > -bool AddressSanitizer::runOnFunction(Function &F) {
> > > > > +bool AddressSanitizer::instrument(Function &F, const
> TargetLibraryInfo
> > > > > *TLI) {
> > > > >    if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage)
> > > > > return false;
> > > > >    if (!ClDebugFunc.empty() && ClDebugFunc == F.getName()) return
> > > > > false;
> > > > >    if (F.getName().startswith("__asan_")) return false;
> > > > > @@ -2498,7 +2553,6 @@ bool AddressSanitizer::runOnFunction(Fun
> > > > >    LLVM_DEBUG(dbgs() << "ASAN instrumenting:\n" << F << "\n");
> > > > >
> > > > >    initializeCallbacks(*F.getParent());
> > > > > -  DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
> > > > >
> > > > >    FunctionStateRAII CleanupObj(this);
> > > > >
> > > > > @@ -2519,8 +2573,6 @@ bool AddressSanitizer::runOnFunction(Fun
> > > > >    bool IsWrite;
> > > > >    unsigned Alignment;
> > > > >    uint64_t TypeSize;
> > > > > -  const TargetLibraryInfo *TLI =
> > > > > -      &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
> > > > >
> > > > >    // Fill the set of memory operations to instrument.
> > > > >    for (auto &BB : F) {
> > > > >
> > > > > Modified:
> llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp?r
> > > > > ev=344274&r1=344273&r2=344274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> > > > > (original)
> > > > > +++ llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
> Thu
> > > > > Oct 11 11:31:51 2018
> > > > > @@ -56,8 +56,8 @@ BasicBlock::iterator llvm::PrepareToSpli
> > > > >  /// initializeInstrumentation - Initialize all passes in the
> > > > > TransformUtils
> > > > >  /// library.
> > > > >  void llvm::initializeInstrumentation(PassRegistry &Registry) {
> > > > > -  initializeAddressSanitizerPass(Registry);
> > > > > -  initializeAddressSanitizerModulePass(Registry);
> > > > > +  initializeAddressSanitizerLegacyPassPass(Registry);
> > > > > +  initializeAddressSanitizerModuleLegacyPassPass(Registry);
> > > > >    initializeBoundsCheckingLegacyPassPass(Registry);
> > > > >    initializeControlHeightReductionLegacyPassPass(Registry);
> > > > >    initializeGCOVProfilerLegacyPassPass(Registry);
> > > > >
> > > > > Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
> > > > > URL: http://llvm.org/viewvc/llvm-
> > > > >
> project/llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll?rev=3
> > > > > 44274&r1=344273&r2=344274&view=diff
> > > > >
> =======================================================================
> > > > > =======
> > > > > --- llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
> > > > > (original)
> > > > > +++ llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll Thu
> Oct
> > > > > 11 11:31:51 2018
> > > > > @@ -1,7 +1,9 @@
> > > > >  ; Test basic address sanitizer instrumentation.
> > > > >  ;
> > > > >  ; RUN: opt < %s -asan -asan-module -S | FileCheck --check-
> > > > > prefixes=CHECK,CHECK-S3 %s
> > > > > +; RUN: opt < %s -passes='function(asan),module(asan)' -S |
> FileCheck -
> > > > > -check-prefixes=CHECK,CHECK-S3 %s
> > > > >  ; RUN: opt < %s -asan -asan-module -asan-mapping-scale=5 -S |
> > > > > FileCheck --check-prefixes=CHECK,CHECK-S5 %s
> > > > > +; RUN: opt < %s -passes='function(asan),module(asan)'
> -asan-mapping-
> > > > > scale=5 -S | FileCheck --check-prefixes=CHECK,CHECK-S5 %s
> > > > >
> > > > >  target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-
> > > > >
> i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-
> > > > > f80:128:128-n8:16:32:64"
> > > > >  target triple = "x86_64-unknown-linux-gnu"
> > > > >
> > > > >
> > > > > _______________________________________________
> > > > > llvm-commits mailing list
> > > > > llvm-commits at lists.llvm.org
> > > > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181023/c355c38c/attachment.html>


More information about the llvm-commits mailing list