[llvm] r275058 - Provide support for preserving assembly comments
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 14 14:46:43 PDT 2016
> On Jul 11, 2016, at 5:42 AM, Nirav Dave via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: niravd
> Date: Mon Jul 11 07:42:14 2016
> New Revision: 275058
>
> URL: http://llvm.org/viewvc/llvm-project?rev=275058&view=rev
> Log:
> Provide support for preserving assembly comments
>
> Preserve assembly comments from input in output assembly and flags to
> toggle property. This is on by default for inline assembly and off in
> llvm-mc.
>
> Parsed comments are emitted immediately before an EOL which generally
> places them on the expected line.
>
> Reviewers: rtrieu, dwmw2, rnk, majnemer
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D20020
>
> Added:
> llvm/trunk/test/MC/AsmParser/inline-comments.ll
> llvm/trunk/test/MC/AsmParser/preserve-comments.s
> Modified:
> llvm/trunk/include/llvm/MC/MCAsmInfo.h
> llvm/trunk/include/llvm/MC/MCStreamer.h
> llvm/trunk/include/llvm/MC/MCTargetOptions.h
> llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> llvm/trunk/lib/MC/MCAsmInfo.cpp
> llvm/trunk/lib/MC/MCAsmStreamer.cpp
> llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
> llvm/trunk/lib/MC/MCStreamer.cpp
> llvm/trunk/tools/llc/llc.cpp
> llvm/trunk/tools/llvm-mc/llvm-mc.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)
> +++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Mon Jul 11 07:42:14 2016
> @@ -362,6 +362,9 @@ protected:
> /// construction (see LLVMTargetMachine::initAsmInfo()).
> bool UseIntegratedAssembler;
>
> + /// Preserve Comments in assembly
> + bool PreserveAsmComments;
> +
> /// Compress DWARF debug sections. Defaults to no compression.
> DebugCompressionType CompressDebugSections;
>
> @@ -575,6 +578,14 @@ public:
> UseIntegratedAssembler = Value;
> }
>
> + /// Return true if assembly (inline or otherwise) should be parsed.
> + bool preserveAsmComments() const { return PreserveAsmComments; }
> +
> + /// Set whether assembly (inline or otherwise) should be parsed.
> + virtual void setPreserveAsmComments(bool Value) {
> + PreserveAsmComments = Value;
> + }
> +
Why is this virtual?
> DebugCompressionType compressDebugSections() const {
> return CompressDebugSections;
> }
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Mon Jul 11 07:42:14 2016
> @@ -252,7 +252,7 @@ public:
> /// correctly?
> virtual bool isIntegratedAssemblerRequired() const { return false; }
>
> - /// \brief Add a textual command.
> + /// \brief Add a textual comment.
> ///
> /// Typically for comments that can be emitted to the generated .s
> /// file if applicable as a QoI issue to make the output of the compiler
> @@ -274,6 +274,12 @@ public:
> /// only prints comments, the object streamer ignores it instead of asserting.
> virtual void emitRawComment(const Twine &T, bool TabPrefix = true);
>
> + /// \brief Add explicit comment T. T is required to be a valid
> + /// comment in the output and does not need to be escaped.
> + virtual void addExplicitComment(const Twine &T);
> + /// \brief Emit added explicit comments.
> + virtual void emitExplicitComments();
> +
> /// AddBlankLine - Emit a blank line to a .s file to pretty it up.
> virtual void AddBlankLine() {}
>
>
> Modified: llvm/trunk/include/llvm/MC/MCTargetOptions.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetOptions.h?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCTargetOptions.h (original)
> +++ llvm/trunk/include/llvm/MC/MCTargetOptions.h Mon Jul 11 07:42:14 2016
> @@ -36,6 +36,10 @@ public:
> bool ShowMCEncoding : 1;
> bool ShowMCInst : 1;
> bool AsmVerbose : 1;
> +
> + /// Preserve Comments in Assembly.
> + bool PreserveAsmComments : 1;
> +
You forgot to add this to the MCTargetOptions ctor.
—
Mehdi
> int DwarfVersion;
> /// getABIName - If this returns a non-empty string this represents the
> /// textual name of the ABI that we want the backend to use, e.g. o32, or
>
> Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Mon Jul 11 07:42:14 2016
> @@ -70,6 +70,8 @@ void LLVMTargetMachine::initAsmInfo() {
> if (Options.DisableIntegratedAS)
> TmpAsmInfo->setUseIntegratedAssembler(false);
>
> + TmpAsmInfo->setPreserveAsmComments(Options.MCOptions.PreserveAsmComments);
> +
> if (Options.CompressDebugSections)
> TmpAsmInfo->setCompressDebugSections(DebugCompressionType::DCT_ZlibGnu);
>
>
> Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmInfo.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmInfo.cpp Mon Jul 11 07:42:14 2016
> @@ -107,6 +107,7 @@ MCAsmInfo::MCAsmInfo() {
> // architecture basis.
> // - The target subclasses for AArch64, ARM, and X86 handle these cases
> UseIntegratedAssembler = false;
> + PreserveAsmComments = true;
>
> CompressDebugSections = DebugCompressionType::DCT_None;
> }
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Mon Jul 11 07:42:14 2016
> @@ -46,6 +46,7 @@ class MCAsmStreamer final : public MCStr
> std::unique_ptr<MCCodeEmitter> Emitter;
> std::unique_ptr<MCAsmBackend> AsmBackend;
>
> + SmallString<128> ExplicitCommentToEmit;
> SmallString<128> CommentToEmit;
> raw_svector_ostream CommentStream;
>
> @@ -73,6 +74,8 @@ public:
> }
>
> inline void EmitEOL() {
> + // Dump Explicit Comments here.
> + emitExplicitComments();
> // If we don't have any comments, just emit a \n.
> if (!IsVerboseAsm) {
> OS << '\n';
> @@ -112,6 +115,9 @@ public:
>
> void emitRawComment(const Twine &T, bool TabPrefix = true) override;
>
> + void addExplicitComment(const Twine &T) override;
> + void emitExplicitComments() override;
> +
> /// AddBlankLine - Emit a blank line to a .s file to pretty it up.
> void AddBlankLine() override {
> EmitEOL();
> @@ -325,6 +331,49 @@ void MCAsmStreamer::emitRawComment(const
> EmitEOL();
> }
>
> +void MCAsmStreamer::addExplicitComment(const Twine &T) {
> + StringRef c = T.getSingleStringRef();
> + if (c.equals(StringRef(MAI->getSeparatorString())))
> + return;
> + if (c.startswith(StringRef("//"))) {
> + ExplicitCommentToEmit.append("\t");
> + ExplicitCommentToEmit.append(MAI->getCommentString());
> + // drop //
> + ExplicitCommentToEmit.append(c.slice(2, c.size()).str());
> + } else if (c.startswith(StringRef("/*"))) {
> + size_t p = 2, len = c.size() - 2;
> + // emit each line in comment as separate newline.
> + do {
> + size_t newp = std::min(len, c.find_first_of("\r\n", p));
> + ExplicitCommentToEmit.append("\t");
> + ExplicitCommentToEmit.append(MAI->getCommentString());
> + ExplicitCommentToEmit.append(c.slice(p, newp).str());
> + // If we have another line in this comment add line
> + if (newp < len)
> + ExplicitCommentToEmit.append("\n");
> + p = newp + 1;
> + } while (p < len);
> + } else if (c.startswith(StringRef(MAI->getCommentString()))) {
> + ExplicitCommentToEmit.append("\t");
> + ExplicitCommentToEmit.append(c.str());
> + } else if (c.front() == '#') {
> + // # are comments for ## commentString. Output extra #.
> + ExplicitCommentToEmit.append("\t#");
> + ExplicitCommentToEmit.append(c.str());
> + } else
> + assert(false && "Unexpected Assembly Comment");
> + // full line comments immediately output
> + if (c.back() == '\n')
> + emitExplicitComments();
> +}
> +
> +void MCAsmStreamer::emitExplicitComments() {
> + StringRef Comments = ExplicitCommentToEmit;
> + if (!Comments.empty())
> + OS << Comments;
> + ExplicitCommentToEmit.clear();
> +}
> +
> void MCAsmStreamer::ChangeSection(MCSection *Section,
> const MCExpr *Subsection) {
> assert(Section && "Cannot switch to a null section!");
> @@ -510,8 +559,10 @@ void MCAsmStreamer::EmitSymbolDesc(MCSym
> }
>
> void MCAsmStreamer::EmitSyntaxDirective() {
> - if (MAI->getAssemblerDialect() == 1)
> - OS << "\t.intel_syntax noprefix\n";
> + if (MAI->getAssemblerDialect() == 1) {
> + OS << "\t.intel_syntax noprefix";
> + EmitEOL();
> + }
> // FIXME: Currently emit unprefix'ed registers.
> // The intel_syntax directive has one optional argument
> // with may have a value of prefix or noprefix.
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Jul 11 07:42:14 2016
> @@ -626,9 +626,20 @@ const AsmToken &AsmParser::Lex() {
> if (Lexer.getTok().is(AsmToken::Error))
> Error(Lexer.getErrLoc(), Lexer.getErr());
>
> + // if it's a end of statement with a comment in it
> + if (getTok().is(AsmToken::EndOfStatement)) {
> + // if this is a line comment output it.
> + if (getTok().getString().front() != '\n' &&
> + getTok().getString().front() != '\r' && MAI.preserveAsmComments())
> + Out.addExplicitComment(Twine(getTok().getString()));
> + }
> +
> const AsmToken *tok = &Lexer.Lex();
> - // Drop comments here.
> +
> + // Parse comments here to be deferred until end of next statement.
> while (tok->is(AsmToken::Comment)) {
> + if (MAI.preserveAsmComments())
> + Out.addExplicitComment(Twine(tok->getString()));
> tok = &Lexer.Lex();
> }
>
>
> Modified: llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp Mon Jul 11 07:42:14 2016
> @@ -188,6 +188,7 @@ bool ELFAsmParser::ParseSectionSwitch(St
> if (getParser().parseExpression(Subsection))
> return true;
> }
> + Lex();
>
> getStreamer().SwitchSection(getContext().getELFSection(Section, Type, Flags),
> Subsection);
>
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Mon Jul 11 07:42:14 2016
> @@ -70,6 +70,9 @@ raw_ostream &MCStreamer::GetCommentOS()
>
> void MCStreamer::emitRawComment(const Twine &T, bool TabPrefix) {}
>
> +void MCStreamer::addExplicitComment(const Twine &T) {}
> +void MCStreamer::emitExplicitComments() {}
> +
> void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend *MAB) {
> for (auto &FI : DwarfFrameInfos)
> FI.CompactUnwindEncoding =
>
> Added: llvm/trunk/test/MC/AsmParser/inline-comments.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/inline-comments.ll?rev=275058&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/AsmParser/inline-comments.ll (added)
> +++ llvm/trunk/test/MC/AsmParser/inline-comments.ll Mon Jul 11 07:42:14 2016
> @@ -0,0 +1,88 @@
> +; RUN: llc %s -o - | sed -n -e '/#APP/,/#NO_APP/p' > %t
> +; RUN: sed -n -e 's/^;CHECK://p' %s > %t2
> +; RUN: diff %t %t2
> +
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +; Function Attrs: nounwind uwtable
> +define void @foo() #0 {
> +entry:
> + call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #NO_APP
> + call void asm sideeffect " ", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK:
> +;CHECK: #NO_APP
> + call void asm sideeffect "\0A", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK:
> +;CHECK:
> +;CHECK: #NO_APP
> + call void asm sideeffect "/*isolated c comment*/", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #isolated c comment
> +;CHECK: #NO_APP
> + call void asm sideeffect "/**/", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #
> +;CHECK: #NO_APP
> + call void asm sideeffect "/*comment with\0Anewline*/", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #comment with
> +;CHECK: #newline
> +;CHECK: #NO_APP
> + call void asm sideeffect "//isolated line comment", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #isolated line comment
> +;CHECK: #NO_APP
> + call void asm sideeffect "#isolated line comment", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #isolated line comment
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop /* after nop */", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop // after nop", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop # after nop", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop /* after explicit ended nop */", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after explicit ended nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop # after explicit ended nop", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after explicit ended nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "nop # after explicit end nop", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # after explicit end nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "/* before nop */ nop", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: nop # before nop
> +;CHECK: #NO_APP
> + call void asm sideeffect "//comment with escaped newline\0A", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: #comment with escaped newline
> +;CHECK:
> +;CHECK: #NO_APP
> + call void asm sideeffect "/*0*/xor/*1*/%eax,/*2*/%ecx/*3*///eol", "~{dirflag},~{fpsr},~{flags}"() #0
> +;CHECK: #APP
> +;CHECK: xorl %eax, %ecx #0 #1 #2 #3 #eol
> +;CHECK: #NO_APP
> + ret void
> +}
> +
> +attributes #0 = { nounwind }
> +
> +!llvm.ident = !{!0}
> +
> +!0 = !{!"clang version 3.9.0 (trunk 268625) (llvm/trunk 268631)"}
>
> Added: llvm/trunk/test/MC/AsmParser/preserve-comments.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/preserve-comments.s?rev=275058&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/AsmParser/preserve-comments.s (added)
> +++ llvm/trunk/test/MC/AsmParser/preserve-comments.s Mon Jul 11 07:42:14 2016
> @@ -0,0 +1,9 @@
> + #RUN: llvm-mc -preserve-comments -n -triple i386-linux-gnu < %s > %t
> + #RUN: diff %s %t
> + .text
> +
> + nop
> + #if DIRECTIVE COMMENT
> + ## WHOLE LINE COMMENT
> + cmpl $196, %eax ## EOL COMMENT
> + #endif
>
> Modified: llvm/trunk/tools/llc/llc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llc/llc.cpp (original)
> +++ llvm/trunk/tools/llc/llc.cpp Mon Jul 11 07:42:14 2016
> @@ -73,6 +73,10 @@ static cl::opt<bool>
> NoIntegratedAssembler("no-integrated-as", cl::Hidden,
> cl::desc("Disable integrated assembler"));
>
> +static cl::opt<bool>
> + NoPreserveComments("fno-preserve-as-comments", cl::Hidden,
> + cl::desc("Preserve Comments in outputted assembly"));
> +
> // Determine optimization level.
> static cl::opt<char>
> OptLevel("O",
> @@ -332,6 +336,7 @@ static int compileModule(char **argv, LL
> Options.MCOptions.ShowMCEncoding = ShowMCEncoding;
> Options.MCOptions.MCUseDwarfDirectory = EnableDwarfDirectory;
> Options.MCOptions.AsmVerbose = AsmVerbose;
> + Options.MCOptions.PreserveAsmComments = !NoPreserveComments;
>
> std::unique_ptr<TargetMachine> Target(
> TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr, FeaturesStr,
>
> Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=275058&r1=275057&r2=275058&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Mon Jul 11 07:42:14 2016
> @@ -87,6 +87,10 @@ PrintImmHex("print-imm-hex", cl::init(fa
> static cl::list<std::string>
> DefineSymbol("defsym", cl::desc("Defines a symbol to be an integer constant"));
>
> +static cl::opt<bool>
> + PreserveComments("preserve-comments",
> + cl::desc("Preserve Comments in outputted assembly"));
> +
> enum OutputFileType {
> OFT_Null,
> OFT_AssemblyFile,
> @@ -430,6 +434,7 @@ int main(int argc, char **argv) {
> }
> MAI->setCompressDebugSections(CompressDebugSections);
> }
> + MAI->setPreserveAsmComments(PreserveComments);
>
> // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and
> // MCObjectFileInfo needs a MCContext reference in order to initialize itself.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list