[llvm] r232392 - [AsmPrinter] Use the per-function subtarget to emit inline asm instructions that

Akira Hatanaka ahatanak at gmail.com
Mon Mar 16 11:27:17 PDT 2015


There is no test case as this commit alone doesn't fix the problem
explained in the commit message. The constructor of MachineFunction has to
be fixed to get the per-function subtarget. See the following link for the
discussion that prompted this commit.

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150309/265459.html

On Mon, Mar 16, 2015 at 11:02 AM, Akira Hatanaka <ahatanaka at apple.com>
wrote:

> Author: ahatanak
> Date: Mon Mar 16 13:02:16 2015
> New Revision: 232392
>
> URL: http://llvm.org/viewvc/llvm-project?rev=232392&view=rev
> Log:
> [AsmPrinter] Use the per-function subtarget to emit inline asm
> instructions that
> are not at the file level.
>
> Previously, the default subtarget created from the target triple was used
> to
> emit inline asm instructions. Compilation would fail in cases where the
> feature
> bits necessary to assemble an inline asm instruction in a function weren't
> set.
>
> Modified:
>     llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=232392&r1=232391&r2=232392&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Mon Mar 16 13:02:16 2015
> @@ -504,7 +504,8 @@ private:
>
>    /// Emit a blob of inline asm to the output streamer.
>    void
> -  EmitInlineAsm(StringRef Str, const MDNode *LocMDNode = nullptr,
> +  EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
> +                const MDNode *LocMDNode = nullptr,
>                  InlineAsm::AsmDialect AsmDialect = InlineAsm::AD_ATT)
> const;
>
>    /// This method formats and emits the specified machine instruction
> that is an
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=232392&r1=232391&r2=232392&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Mon Mar 16 13:02:16
> 2015
> @@ -221,9 +221,13 @@ bool AsmPrinter::doInitialization(Module
>
>    // Emit module-level inline asm if it exists.
>    if (!M.getModuleInlineAsm().empty()) {
> +    // We're at the module level. Construct MCSubtarget from the default
> CPU
> +    // and target triple.
> +    std::unique_ptr<MCSubtargetInfo>
> STI(TM.getTarget().createMCSubtargetInfo(
> +        TM.getTargetTriple(), TM.getTargetCPU(),
> TM.getTargetFeatureString()));
>      OutStreamer.AddComment("Start of file scope inline assembly");
>      OutStreamer.AddBlankLine();
> -    EmitInlineAsm(M.getModuleInlineAsm()+"\n");
> +    EmitInlineAsm(M.getModuleInlineAsm()+"\n", *STI);
>      OutStreamer.AddComment("End of file scope inline assembly");
>      OutStreamer.AddBlankLine();
>    }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp?rev=232392&r1=232391&r2=232392&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp Mon Mar 16
> 13:02:16 2015
> @@ -73,7 +73,8 @@ static void srcMgrDiagHandler(const SMDi
>  }
>
>  /// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
> -void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode,
> +void AsmPrinter::EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
> +                               const MDNode *LocMDNode,
>                                 InlineAsm::AsmDialect Dialect) const {
>    assert(!Str.empty() && "Can't emit empty inline asm block");
>
> @@ -93,17 +94,7 @@ void AsmPrinter::EmitInlineAsm(StringRef
>        !OutStreamer.isIntegratedAssemblerRequired()) {
>      emitInlineAsmStart();
>      OutStreamer.EmitRawText(Str);
> -    // If we have a machine function then grab the MCSubtarget off of
> that,
> -    // otherwise we're at the module level and want to construct one from
> -    // the default CPU and target triple.
> -    if (MF) {
> -      emitInlineAsmEnd(MF->getSubtarget<MCSubtargetInfo>(), nullptr);
> -    } else {
> -      std::unique_ptr<MCSubtargetInfo>
> STI(TM.getTarget().createMCSubtargetInfo(
> -          TM.getTargetTriple(), TM.getTargetCPU(),
> -          TM.getTargetFeatureString()));
> -      emitInlineAsmEnd(*STI, nullptr);
> -    }
> +    emitInlineAsmEnd(STI, nullptr);
>      return;
>    }
>
> @@ -135,19 +126,11 @@ void AsmPrinter::EmitInlineAsm(StringRef
>    std::unique_ptr<MCAsmParser> Parser(
>        createMCAsmParser(SrcMgr, OutContext, OutStreamer, *MAI));
>
> -  // Initialize the parser with a fresh subtarget info. It is better to
> use a
> -  // new STI here because the parser may modify it and we do not want
> those
> -  // modifications to persist after parsing the inlineasm. The
> modifications
> -  // made by the parser will be seen by the code emitters because it
> passes
> -  // the current STI down to the EncodeInstruction() method.
> -  std::unique_ptr<MCSubtargetInfo>
> STI(TM.getTarget().createMCSubtargetInfo(
> -      TM.getTargetTriple(), TM.getTargetCPU(),
> TM.getTargetFeatureString()));
> -
> -  // Preserve a copy of the original STI because the parser may modify
> it.  For
> -  // example, when switching between arm and thumb mode. If the target
> needs to
> -  // emit code to return to the original state it can do so in
> +  // Create a temporary copy of the original STI because the parser may
> modify
> +  // it. For example, when switching between arm and thumb mode. If the
> target
> +  // needs to emit code to return to the original state it can do so in
>    // emitInlineAsmEnd().
> -  MCSubtargetInfo STIOrig = *STI;
> +  MCSubtargetInfo TmpSTI = STI;
>
>    // We create a new MCInstrInfo here since we might be at the module
> level
>    // and not have a MachineFunction to initialize the TargetInstrInfo
> from and
> @@ -155,7 +138,7 @@ void AsmPrinter::EmitInlineAsm(StringRef
>    // because it's not subtarget dependent.
>    std::unique_ptr<MCInstrInfo> MII(TM.getTarget().createMCInstrInfo());
>    std::unique_ptr<MCTargetAsmParser> TAP(TM.getTarget().createMCAsmParser(
> -      *STI, *Parser, *MII, TM.Options.MCOptions));
> +      TmpSTI, *Parser, *MII, TM.Options.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");
> @@ -170,7 +153,7 @@ void AsmPrinter::EmitInlineAsm(StringRef
>    // Don't implicitly switch to the text section before the asm.
>    int Res = Parser->Run(/*NoInitialTextSection*/ true,
>                          /*NoFinalize*/ true);
> -  emitInlineAsmEnd(STIOrig, STI.get());
> +  emitInlineAsmEnd(STI, &TmpSTI);
>    if (Res && !HasDiagHandler)
>      report_fatal_error("Error parsing inline asm\n");
>  }
> @@ -505,7 +488,7 @@ void AsmPrinter::EmitInlineAsm(const Mac
>    else
>      EmitMSInlineAsmStr(AsmStr, MI, MMI, InlineAsmVariant, AP, LocCookie,
> OS);
>
> -  EmitInlineAsm(OS.str(), LocMD, MI->getInlineAsmDialect());
> +  EmitInlineAsm(OS.str(), getSubtargetInfo(), LocMD,
> MI->getInlineAsmDialect());
>
>    // Emit the #NOAPP end marker.  This has to happen even if verbose-asm
> isn't
>    // enabled, so we use emitRawComment.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150316/3762f3c7/attachment.html>


More information about the llvm-commits mailing list