<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 13, 2016 at 12:01 AM, Filipe Cabecinhas <span dir="ltr"><<a href="mailto:scee@filcab.net" target="_blank">scee@filcab.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
> On 13 May 2016, at 07:03, Sean Silva <<a href="mailto:chisophugis@gmail.com">chisophugis@gmail.com</a>> wrote:<br>
><br>
><br>
><br>
> On Thu, May 12, 2016 at 9:51 AM, Filipe Cabecinhas via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
> Author: filcab<br>
> Date: Thu May 12 11:51:36 2016<br>
> New Revision: 269309<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=269309&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=269309&view=rev</a><br>
> Log:<br>
> [ubsan] Add -fsanitize-undefined-strip-path-components=N<br>
><br>
> Summary:<br>
> This option allows the user to control how much of the file name is<br>
> emitted by UBSan. Tuning this option allows one to save space in the<br>
> resulting binary, which is helpful for restricted execution<br>
> environments.<br>
><br>
> With a positive N, UBSan skips the first N path components.<br>
> With a negative N, UBSan only keeps the last N path components.<br>
><br>
> Reviewers: rsmith<br>
><br>
> Subscribers: cfe-commits<br>
><br>
> Differential Revision: <a href="http://reviews.llvm.org/D19666" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19666</a><br>
><br>
> Added:<br>
>     cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp<br>
>     cfe/trunk/test/Driver/fubsan-strip-path-components.cpp<br>
> Modified:<br>
>     cfe/trunk/docs/UndefinedBehaviorSanitizer.rst<br>
>     cfe/trunk/include/clang/Driver/Options.td<br>
>     cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
>     cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
>     cfe/trunk/lib/Driver/Tools.cpp<br>
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
><br>
> Modified: cfe/trunk/docs/UndefinedBehaviorSanitizer.rst<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UndefinedBehaviorSanitizer.rst?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UndefinedBehaviorSanitizer.rst?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/docs/UndefinedBehaviorSanitizer.rst (original)<br>
> +++ cfe/trunk/docs/UndefinedBehaviorSanitizer.rst Thu May 12 11:51:36 2016<br>
> @@ -228,6 +228,26 @@ UndefinedBehaviorSanitizer is available<br>
>  3.3. The test suite is integrated into the CMake build and can be run with<br>
>  ``check-ubsan`` command.<br>
><br>
> +Additional Configuration<br>
> +========================<br>
> +<br>
> +UndefinedBehaviorSanitizer adds static check data for each check unless it is<br>
> +in trap mode. This check data includes the full file name. The option<br>
> +``-fsanitize-undefined-strip-path-components=N`` can be used to trim this<br>
> +information. If ``N`` is positive, file information emitted by<br>
> +UndefinedBehaviorSanitizer will drop the first ``N`` components from the file<br>
> +path. If ``N`` is negative, the last ``N`` components will be kept.<br>
> +<br>
> +Example<br>
> +-------<br>
> +<br>
> +For a file called ``/code/library/file.cpp``, here is what would be emitted:<br>
> +* Default (No flag, or ``-fsanitize-undefined-strip-path-components=0``): ``/code/library/file.cpp``<br>
> +* ``-fsanitize-undefined-strip-path-components=1``: ``code/library/file.cpp``<br>
> +* ``-fsanitize-undefined-strip-path-components=2``: ``library/file.cpp``<br>
> +* ``-fsanitize-undefined-strip-path-components=-1``: ``file.cpp``<br>
> +* ``-fsanitize-undefined-strip-path-components=-2``: ``library/file.cpp``<br>
><br>
> How are drive letters handled?<br>
><br>
> -- Sean Silva<br>
<br>
</div></div>Same way as Path iterator:<br>
///   /          => /<br>
///   /foo       => /,foo<br>
///   foo/       => foo,.<br>
///   /foo/bar   => /,foo,bar<br>
///   ../        => ..,.<br>
///   C:\foo\bar => C:,/,foo,bar<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>Please mention this in the user-facing documentation.</div><div><br></div><div>-- Sean Silva</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">
  Filipe<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
><br>
> +<br>
>  More Information<br>
>  ================<br>
><br>
><br>
> Modified: cfe/trunk/include/clang/Driver/Options.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/include/clang/Driver/Options.td (original)<br>
> +++ cfe/trunk/include/clang/Driver/Options.td Thu May 12 11:51:36 2016<br>
> @@ -677,6 +677,10 @@ def fsanitize_stats : Flag<["-"], "fsani<br>
>  def fno_sanitize_stats : Flag<["-"], "fno-sanitize-stats">,<br>
>                                   Group<f_clang_Group>, Flags<[CC1Option]>,<br>
>                                   HelpText<"Disable sanitizer statistics gathering.">;<br>
> +def fsanitize_undefined_strip_path_components_EQ : Joined<["-"], "fsanitize-undefined-strip-path-components=">,<br>
> +  Group<f_clang_Group>, Flags<[CC1Option]>, MetaVarName<"<number>">,<br>
> +  HelpText<"Strip (or keep only, if negative) a given number of path components "<br>
> +           "when emitting check metadata.">;<br>
>  def funsafe_math_optimizations : Flag<["-"], "funsafe-math-optimizations">,<br>
>    Group<f_Group>;<br>
>  def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">,<br>
><br>
> Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)<br>
> +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Thu May 12 11:51:36 2016<br>
> @@ -225,6 +225,10 @@ ENUM_CODEGENOPT(VecLib, VectorLibrary, 1<br>
>  /// The default TLS model to use.<br>
>  ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel)<br>
><br>
> +/// Number of path components to strip when emitting checks. (0 == full<br>
> +/// filename)<br>
> +VALUE_CODEGENOPT(EmitCheckPathComponentsToStrip, 32, 0)<br>
> +<br>
>  #undef CODEGENOPT<br>
>  #undef ENUM_CODEGENOPT<br>
>  #undef VALUE_CODEGENOPT<br>
><br>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu May 12 11:51:36 2016<br>
> @@ -32,6 +32,7 @@<br>
>  #include "llvm/IR/MDBuilder.h"<br>
>  #include "llvm/Support/ConvertUTF.h"<br>
>  #include "llvm/Support/MathExtras.h"<br>
> +#include "llvm/Support/Path.h"<br>
>  #include "llvm/Transforms/Utils/SanitizerStats.h"<br>
><br>
>  using namespace clang;<br>
> @@ -2367,7 +2368,33 @@ llvm::Constant *CodeGenFunction::EmitChe<br>
><br>
>    PresumedLoc PLoc = getContext().getSourceManager().getPresumedLoc(Loc);<br>
>    if (PLoc.isValid()) {<br>
> -    auto FilenameGV = CGM.GetAddrOfConstantCString(PLoc.getFilename(), ".src");<br>
> +    StringRef FilenameString = PLoc.getFilename();<br>
> +<br>
> +    int PathComponentsToStrip =<br>
> +        CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;<br>
> +    if (PathComponentsToStrip < 0) {<br>
> +      assert(PathComponentsToStrip != INT_MIN);<br>
> +      int PathComponentsToKeep = -PathComponentsToStrip;<br>
> +      auto I = llvm::sys::path::rbegin(FilenameString);<br>
> +      auto E = llvm::sys::path::rend(FilenameString);<br>
> +      while (I != E && --PathComponentsToKeep)<br>
> +        ++I;<br>
> +<br>
> +      FilenameString = FilenameString.substr(I - E);<br>
> +    } else if (PathComponentsToStrip > 0) {<br>
> +      auto I = llvm::sys::path::begin(FilenameString);<br>
> +      auto E = llvm::sys::path::end(FilenameString);<br>
> +      while (I != E && PathComponentsToStrip--)<br>
> +        ++I;<br>
> +<br>
> +      if (I != E)<br>
> +        FilenameString =<br>
> +            FilenameString.substr(I - llvm::sys::path::begin(FilenameString));<br>
> +      else<br>
> +        FilenameString = llvm::sys::path::filename(FilenameString);<br>
> +    }<br>
> +<br>
> +    auto FilenameGV = CGM.GetAddrOfConstantCString(FilenameString, ".src");<br>
>      CGM.getSanitizerMetadata()->disableSanitizerForGlobal(<br>
>                            cast<llvm::GlobalVariable>(FilenameGV.getPointer()));<br>
>      Filename = FilenameGV.getPointer();<br>
><br>
> Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
> +++ cfe/trunk/lib/Driver/Tools.cpp Thu May 12 11:51:36 2016<br>
> @@ -5607,6 +5607,10 @@ void Clang::ConstructJob(Compilation &C,<br>
>    if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))<br>
>      A->render(Args, CmdArgs);<br>
><br>
> +  if (Arg *A = Args.getLastArg(<br>
> +          options::OPT_fsanitize_undefined_strip_path_components_EQ))<br>
> +    A->render(Args, CmdArgs);<br>
> +<br>
>    // -fdollars-in-identifiers default varies depending on platform and<br>
>    // language; only pass if specified.<br>
>    if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,<br>
><br>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=269309&r1=269308&r2=269309&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=269309&r1=269308&r2=269309&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu May 12 11:51:36 2016<br>
> @@ -823,6 +823,9 @@ static bool ParseCodeGenArgs(CodeGenOpti<br>
><br>
>    Opts.Backchain = Args.hasArg(OPT_mbackchain);<br>
><br>
> +  Opts.EmitCheckPathComponentsToStrip = getLastArgIntValue(<br>
> +      Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);<br>
> +<br>
>    return Success;<br>
>  }<br>
><br>
><br>
> Added: cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp?rev=269309&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp?rev=269309&view=auto</a><br>
> ==============================================================================<br>
> --- cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp (added)<br>
> +++ cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp Thu May 12 11:51:36 2016<br>
> @@ -0,0 +1,29 @@<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - | FileCheck %s -check-prefix=REGULAR -check-prefix=CHECK<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=0 | FileCheck %s -check-prefix=REGULAR -check-prefix=CHECK<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=2 | FileCheck %s -check-prefix=REMOVE-FIRST-TWO -check-prefix=CHECK<br>
> +<br>
> +// Try to strip too much:<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-99999 | FileCheck %s -check-prefix=REGULAR<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=99999 | FileCheck %s -check-prefix=LAST-ONLY<br>
> +<br>
> +// Check stripping from the file name<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-2 | FileCheck %s -check-prefix=LAST-TWO<br>
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-1 | FileCheck %s -check-prefix=LAST-ONLY<br>
> +<br>
> +// REGULAR: @[[SRC:[0-9.a-zA-Z_]+]] =      private unnamed_addr constant [{{.*}} x i8] c"{{.*test(.|\\5C)CodeGen(.|\\5C)ubsan-strip-path-components\.cpp}}\00", align 1<br>
> +<br>
> +// First path component: "/" or "$drive_letter:", then a name, or '\5C' on Windows<br>
> +// REMOVE-FIRST-TWO: @[[STR:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"{{(.:|/)([^\\/]*(/|\\5C))}}[[REST:.*ubsan-strip-path-components\.cpp]]\00", align 1<br>
> +// REMOVE-FIRST-TWO: @[[SRC:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"[[REST]]\00", align 1<br>
> +<br>
> +// LAST-TWO: @[[SRC:[0-9.a-zA-Z_]+]] =     private unnamed_addr constant [{{.*}} x i8] c"CodeGen{{/|\\5C}}ubsan-strip-path-components.cpp\00", align 1<br>
> +// LAST-ONLY: @[[SRC:[0-9.a-zA-Z_]+]] =    private unnamed_addr constant [{{.*}} x i8] c"ubsan-strip-path-components.cpp\00", align 1<br>
> +<br>
> +// CHECK: @[[STATIC_DATA:[0-9.a-zA-Z_]+]] = private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 } } { { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+6]], i32 3 } }<br>
> +void g(const char *);<br>
> +void f() {<br>
> +  // CHECK-LABEL: @_Z1fv(<br>
> +  g(__FILE__);<br>
> +  // CHECK: call void @__ubsan_handle_builtin_unreachable(i8* bitcast ({ { [{{.*}} x i8]*, i32, i32 } }* @[[STATIC_DATA]] to i8*)) {{.*}}, !nosanitize<br>
> +  __builtin_unreachable();<br>
> +}<br>
><br>
> Added: cfe/trunk/test/Driver/fubsan-strip-path-components.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fubsan-strip-path-components.cpp?rev=269309&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fubsan-strip-path-components.cpp?rev=269309&view=auto</a><br>
> ==============================================================================<br>
> --- cfe/trunk/test/Driver/fubsan-strip-path-components.cpp (added)<br>
> +++ cfe/trunk/test/Driver/fubsan-strip-path-components.cpp Thu May 12 11:51:36 2016<br>
> @@ -0,0 +1,2 @@<br>
> +// RUN: %clang %s -### -o %t.o -fsanitize-undefined-strip-path-components=42 2>&1 | FileCheck %s<br>
> +// CHECK: "-fsanitize-undefined-strip-path-components=42"<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
><br>
<br>
</div></div></blockquote></div><br></div></div>