[llvm] r341082 - [libFuzzer] Port to Windows

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 11 18:23:11 PDT 2018


This patch seem to have two nearly-identical sections starting from a
comment "Account for the fact that on windows-msvc"
Is it possible to account for any such fact just once?

On Thu, Aug 30, 2018 at 8:55 AM Matt Morehouse via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: morehouse
> Date: Thu Aug 30 08:54:44 2018
> New Revision: 341082
>
> URL: http://llvm.org/viewvc/llvm-project?rev=341082&view=rev
> Log:
> [libFuzzer] Port to Windows
>
> Summary:
> Port libFuzzer to windows-msvc.
> This patch allows libFuzzer targets to be built and run on Windows, using
> -fsanitize=fuzzer and/or fsanitize=fuzzer-no-link. It allows these forms of
> coverage instrumentation to work on Windows as well.
> It does not fix all issues, such as those with
> -fsanitize-coverage=stack-depth, which is not usable on Windows as of this
> patch.
> It also does not fix any libFuzzer integration tests. Nearly all of them
> fail to compile, fixing them will come in a later patch, so libFuzzer tests
> are disabled on Windows until them.
>
> Patch By: metzman
>
> Reviewers: morehouse, rnk
>
> Reviewed By: morehouse, rnk
>
> Subscribers: #sanitizers, delcypher, morehouse, kcc, eraman
>
> Differential Revision: https://reviews.llvm.org/D51022
>
> Added:
>
> llvm/trunk/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll
> Modified:
>     llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp?rev=341082&r1=341081&r2=341082&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/SanitizerCoverage.cpp Thu
> Aug 30 08:54:44 2018
> @@ -273,9 +273,20 @@ Function *SanitizerCoverageModule::Creat
>    auto SecStart = SecStartEnd.first;
>    auto SecEnd = SecStartEnd.second;
>    Function *CtorFunc;
> +  Value *SecStartPtr = nullptr;
> +  // Account for the fact that on windows-msvc __start_* symbols actually
> +  // point to a uint64_t before the start of the array.
> +  if (TargetTriple.getObjectFormat() == Triple::COFF) {
> +    auto SecStartI8Ptr = IRB.CreatePointerCast(SecStart, Int8PtrTy);
> +    auto GEP = IRB.CreateGEP(SecStartI8Ptr,
> +                             ConstantInt::get(IntptrTy,
> sizeof(uint64_t)));
> +    SecStartPtr = IRB.CreatePointerCast(GEP, Ty);
> +  } else {
> +    SecStartPtr = IRB.CreatePointerCast(SecStart, Ty);
> +  }
>    std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions(
>        M, SanCovModuleCtorName, InitFunctionName, {Ty, Ty},
> -      {IRB.CreatePointerCast(SecStart, Ty), IRB.CreatePointerCast(SecEnd,
> Ty)});
> +      {SecStartPtr, IRB.CreatePointerCast(SecEnd, Ty)});
>
>    if (TargetTriple.supportsCOMDAT()) {
>      // Use comdat to dedup CtorFunc.
> @@ -397,9 +408,20 @@ bool SanitizerCoverageModule::runOnModul
>      Function *InitFunction = declareSanitizerInitFunction(
>          M, SanCovPCsInitName, {IntptrPtrTy, IntptrPtrTy});
>      IRBuilder<> IRBCtor(Ctor->getEntryBlock().getTerminator());
> -    IRBCtor.CreateCall(InitFunction,
> -                       {IRB.CreatePointerCast(SecStartEnd.first,
> IntptrPtrTy),
> -                        IRB.CreatePointerCast(SecStartEnd.second,
> IntptrPtrTy)});
> +    Value *SecStartPtr = nullptr;
> +    // Account for the fact that on windows-msvc __start_pc_table actually
> +    // points to a uint64_t before the start of the PC table.
> +    if (TargetTriple.getObjectFormat() == Triple::COFF) {
> +      auto SecStartI8Ptr = IRB.CreatePointerCast(SecStartEnd.first,
> Int8PtrTy);
> +      auto GEP = IRB.CreateGEP(SecStartI8Ptr,
> +                               ConstantInt::get(IntptrTy,
> sizeof(uint64_t)));
> +      SecStartPtr = IRB.CreatePointerCast(GEP, IntptrPtrTy);
> +    } else {
> +      SecStartPtr = IRB.CreatePointerCast(SecStartEnd.first, IntptrPtrTy);
> +    }
> +    IRBCtor.CreateCall(
> +        InitFunction,
> +        {SecStartPtr, IRB.CreatePointerCast(SecStartEnd.second,
> IntptrPtrTy)});
>    }
>    // We don't reference these arrays directly in any of our runtime
> functions,
>    // so we need to prevent them from being dead stripped.
> @@ -809,8 +831,13 @@ void SanitizerCoverageModule::InjectCove
>
>  std::string
>  SanitizerCoverageModule::getSectionName(const std::string &Section) const
> {
> -  if (TargetTriple.getObjectFormat() == Triple::COFF)
> -    return ".SCOV$M";
> +  if (TargetTriple.getObjectFormat() == Triple::COFF) {
> +    if (Section == SanCovCountersSectionName)
> +      return ".SCOV$CM";
> +    if (Section == SanCovPCsSectionName)
> +      return ".SCOVP$M";
> +    return ".SCOV$GM"; // For SanCovGuardsSectionName.
> +  }
>    if (TargetTriple.isOSBinFormatMachO())
>      return "__DATA,__" + Section;
>    return "__" + Section;
>
> Added:
> llvm/trunk/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll?rev=341082&view=auto
>
> ==============================================================================
> ---
> llvm/trunk/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll
> (added)
> +++
> llvm/trunk/test/Instrumentation/SanitizerCoverage/coff-pc-table-inline-8bit-counters.ll
> Thu Aug 30 08:54:44 2018
> @@ -0,0 +1,12 @@
> +; Checks that the PC and 8-bit Counter Arrays are placed in their own
> sections in COFF binaries.
> +; RUN: opt < %s -sancov -sanitizer-coverage-level=1
> -sanitizer-coverage-inline-8bit-counters=1 -sanitizer-coverage-pc-table=1
> -S | FileCheck %s
> +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-pc-windows-msvc19.14.26433"
> +
> +define void @foo() {
> +entry:
> +  ret void
> +}
> +
> +; CHECK-DAG: section ".SCOV{{\$}}CM",
> +; CHECK-DAG: section ".SCOVP{{\$}}M",
>
>
> _______________________________________________
> 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/20181011/455c48ea/attachment.html>


More information about the llvm-commits mailing list