[PATCH] Stop resetting SanitizeAddress in TargetMachine::resetTargetOptions

Eric Christopher echristo at gmail.com
Fri May 8 15:54:15 PDT 2015


Hi Akira,

This is just moving the resetting to a different place. How about we get
rid of the resetting completely?

Thanks!

-eric

On Thu, May 7, 2015 at 12:26 PM Akira Hatanaka <ahatanak at gmail.com> wrote:

> Hi echristo, dexonsmith,
>
> This is part of the work to remove TargetMachine::resetTargetOptions (the
> FIXME added to TargetMachine.cpp in r236009 explains why this function has
> to be removed).
>
> In this patch, a temporary copy of MCTargetOptions is created and its
> SanitizeAddress field is reset based on the function's attribute every time
> an InlineAsm instruction is emitted in AsmPrinter::EmitInlineAsm. This is
> an NFC fix. Also, fixes the changes made to asm_attr.ll in r212455 which
> seems to have unintentionally dropped the "8" in the function name (I
> believe this test is supposed to fail if the line resetting SanitizeAddress
> in resetTargetOptions is removed, but it doesn't).
>
> http://reviews.llvm.org/D9570
>
> Files:
>   include/llvm/CodeGen/AsmPrinter.h
>   lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>   lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
>   lib/Target/TargetMachine.cpp
>   test/Instrumentation/AddressSanitizer/X86/asm_attr.ll
>
> Index: include/llvm/CodeGen/AsmPrinter.h
> ===================================================================
> --- include/llvm/CodeGen/AsmPrinter.h
> +++ include/llvm/CodeGen/AsmPrinter.h
> @@ -53,6 +53,7 @@
>  class MCStreamer;
>  class MCSubtargetInfo;
>  class MCSymbol;
> +class MCTargetOptions;
>  class MDNode;
>  class DwarfDebug;
>  class Mangler;
> @@ -498,6 +499,7 @@
>    /// Emit a blob of inline asm to the output streamer.
>    void
>    EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
> +                const MCTargetOptions &MCOptions,
>                  const MDNode *LocMDNode = nullptr,
>                  InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT)
> const;
>
> Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> +++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> @@ -225,7 +225,7 @@
>          TM.getTargetTriple(), TM.getTargetCPU(),
> TM.getTargetFeatureString()));
>      OutStreamer->AddComment("Start of file scope inline assembly");
>      OutStreamer->AddBlankLine();
> -    EmitInlineAsm(M.getModuleInlineAsm()+"\n", *STI);
> +    EmitInlineAsm(M.getModuleInlineAsm()+"\n", *STI,
> TM.Options.MCOptions);
>      OutStreamer->AddComment("End of file scope inline assembly");
>      OutStreamer->AddBlankLine();
>    }
> Index: lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> +++ lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> @@ -74,6 +74,7 @@
>
>  /// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
>  void AsmPrinter::EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
> +                               const MCTargetOptions &MCOptions,
>                                 const MDNode *LocMDNode,
>                                 InlineAsm::AsmDialect Dialect) const {
>    assert(!Str.empty() && "Can't emit empty inline asm block");
> @@ -138,7 +139,7 @@
>    // because it's not subtarget dependent.
>    std::unique_ptr<MCInstrInfo> MII(TM.getTarget().createMCInstrInfo());
>    std::unique_ptr<MCTargetAsmParser> TAP(TM.getTarget().createMCAsmParser(
> -      TmpSTI, *Parser, *MII, TM.Options.MCOptions));
> +      TmpSTI, *Parser, *MII, MCOptions));
>    if (!TAP)
>      report_fatal_error("Inline asm not supported by this streamer because"
>                         " we don't have an asm parser for this target\n");
> @@ -488,7 +489,13 @@
>    else
>      EmitMSInlineAsmStr(AsmStr, MI, MMI, InlineAsmVariant, AP, LocCookie,
> OS);
>
> -  EmitInlineAsm(OS.str(), getSubtargetInfo(), LocMD,
> MI->getInlineAsmDialect());
> +  // Reset SanitizeAddress based on the function's attribute.
> +  MCTargetOptions MCOptions = TM.Options.MCOptions;
> +  MCOptions.SanitizeAddress =
> +      MF->getFunction()->hasFnAttribute(Attribute::SanitizeAddress);
> +
> +  EmitInlineAsm(OS.str(), getSubtargetInfo(), MCOptions, LocMD,
> +                MI->getInlineAsmDialect());
>
>    // Emit the #NOAPP end marker.  This has to happen even if verbose-asm
> isn't
>    // enabled, so we use emitRawComment.
> Index: lib/Target/TargetMachine.cpp
> ===================================================================
> --- lib/Target/TargetMachine.cpp
> +++ lib/Target/TargetMachine.cpp
> @@ -73,8 +73,6 @@
>    RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");
>    RESET_OPTION(UseSoftFloat, "use-soft-float");
>    RESET_OPTION(DisableTailCalls, "disable-tail-calls");
> -
> -  Options.MCOptions.SanitizeAddress =
> F.hasFnAttribute(Attribute::SanitizeAddress);
>  }
>
>  /// getRelocationModel - Returns the code generation relocation model. The
> Index: test/Instrumentation/AddressSanitizer/X86/asm_attr.ll
> ===================================================================
> --- test/Instrumentation/AddressSanitizer/X86/asm_attr.ll
> +++ test/Instrumentation/AddressSanitizer/X86/asm_attr.ll
> @@ -4,8 +4,8 @@
>  target triple = "x86_64-unknown-linux-gnu"
>
>  ; CHECK-LABEL: mov_no_attr
> -; CHECK-NOT: callq __asan_report_load at PLT
> -; CHECK-NOT: callq __asan_report_store at PLT
> +; CHECK-NOT: callq __asan_report_load8 at PLT
> +; CHECK-NOT: callq __asan_report_store8 at PLT
>  define void @mov_no_attr(i64* %dst, i64* %src) {
>    tail call void asm sideeffect "movq ($1), %rax  \0A\09movq %rax, ($0)
> \0A\09", "r,r,~{memory},~{rax},~{dirflag},~{fpsr},~{flags}"(i64* %dst, i64*
> %src)
>    ret void
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150508/fe3185d7/attachment.html>


More information about the llvm-commits mailing list