[llvm] r228042 - AsmParser: Recognize DW_TAG_* constants

Duncan P. N. Exon Smith dexonsmith at apple.com
Tue Feb 3 13:56:02 PST 2015


Author: dexonsmith
Date: Tue Feb  3 15:56:01 2015
New Revision: 228042

URL: http://llvm.org/viewvc/llvm-project?rev=228042&view=rev
Log:
AsmParser: Recognize DW_TAG_* constants

Recognize `DW_TAG_` constants in assembly, and output it by default for
`GenericDebugNode`.

Added:
    llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-bad.ll
    llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-wrong-type.ll
Modified:
    llvm/trunk/lib/AsmParser/LLLexer.cpp
    llvm/trunk/lib/AsmParser/LLParser.cpp
    llvm/trunk/lib/AsmParser/LLParser.h
    llvm/trunk/lib/AsmParser/LLToken.h
    llvm/trunk/lib/IR/AsmWriter.cpp
    llvm/trunk/test/Assembler/generic-debug-node.ll
    llvm/trunk/utils/vim/llvm.vim

Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
+++ llvm/trunk/lib/AsmParser/LLLexer.cpp Tue Feb  3 15:56:01 2015
@@ -738,6 +738,12 @@ lltok::Kind LLLexer::LexIdentifier() {
   INSTKEYWORD(landingpad,     LandingPad);
 #undef INSTKEYWORD
 
+  if (Len >= strlen("DW_TAG_") &&
+      !memcmp(StartChar, "DW_TAG_", strlen("DW_TAG_"))) {
+    StrVal.assign(StartChar, CurPtr);
+    return lltok::DwarfTag;
+  }
+
   // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by
   // the CFE to avoid forcing it to deal with 64-bit numbers.
   if ((TokStart[0] == 'u' || TokStart[0] == 's') &&

Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Tue Feb  3 15:56:01 2015
@@ -24,6 +24,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Operator.h"
 #include "llvm/IR/ValueSymbolTable.h"
+#include "llvm/Support/Dwarf.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/SaveAndRestore.h"
 #include "llvm/Support/raw_ostream.h"
@@ -2936,6 +2937,28 @@ bool LLParser::ParseMDField(LocTy Loc, S
   return false;
 }
 
+bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) {
+  if (Lex.getKind() == lltok::APSInt)
+    return ParseMDField(Loc, Name,
+                        static_cast<MDUnsignedField<uint32_t> &>(Result));
+
+  if (Result.Seen)
+    return Error(Loc,
+                 "field '" + Name + "' cannot be specified more than once");
+
+  if (Lex.getKind() != lltok::DwarfTag)
+    return TokError("expected DWARF tag");
+
+  unsigned Tag = dwarf::getTag(Lex.getStrVal());
+  if (Tag == dwarf::DW_TAG_invalid)
+    return TokError("invalid DWARF tag" + Twine(" '") + Lex.getStrVal() + "'");
+  assert(Tag < 1u << 16 && "Expected valid DWARF tag");
+
+  Result.assign(Tag);
+  Lex.Lex();
+  return false;
+}
+
 bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) {
   Metadata *MD;
   if (ParseMetadata(MD, nullptr))
@@ -3056,7 +3079,7 @@ bool LLParser::ParseMDLocation(MDNode *&
 ///   ::= !GenericDebugNode(tag: 15, header: "...", operands: {...})
 bool LLParser::ParseGenericDebugNode(MDNode *&Result, bool IsDistinct) {
 #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \
-  REQUIRED(tag, MDUnsignedField<uint32_t>, (0, ~0u >> 16));                    \
+  REQUIRED(tag, DwarfTagField, );                                              \
   OPTIONAL(header, MDStringField, );                                           \
   OPTIONAL(operands, MDFieldList, );
   PARSE_MD_FIELDS();

Modified: llvm/trunk/lib/AsmParser/LLParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.h (original)
+++ llvm/trunk/lib/AsmParser/LLParser.h Tue Feb  3 15:56:01 2015
@@ -102,6 +102,9 @@ namespace llvm {
                     NumTy Max = std::numeric_limits<NumTy>::max())
         : ImplTy(Default), Max(Max) {}
   };
+  struct DwarfTagField : public MDUnsignedField<uint32_t> {
+    DwarfTagField() : MDUnsignedField<uint32_t>(0, ~0u >> 16) {}
+  };
   struct MDField : public MDFieldImpl<Metadata *> {
     MDField() : ImplTy(nullptr) {}
   };
@@ -427,6 +430,7 @@ namespace llvm {
 
     bool ParseMDField(LocTy Loc, StringRef Name,
                       MDUnsignedField<uint32_t> &Result);
+    bool ParseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, MDField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, MDStringField &Result);
     bool ParseMDField(LocTy Loc, StringRef Name, MDFieldList &Result);

Modified: llvm/trunk/lib/AsmParser/LLToken.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLToken.h (original)
+++ llvm/trunk/lib/AsmParser/LLToken.h Tue Feb  3 15:56:01 2015
@@ -198,6 +198,7 @@ namespace lltok {
     LocalVar,          // %foo %"foo"
     MetadataVar,       // !foo
     StringConstant,    // "foo"
+    DwarfTag,          // DW_TAG_foo (includes "DW_TAG_")
 
     // Type valued tokens (TyVal).
     Type,

Modified: llvm/trunk/lib/IR/AsmWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/lib/IR/AsmWriter.cpp (original)
+++ llvm/trunk/lib/IR/AsmWriter.cpp Tue Feb  3 15:56:01 2015
@@ -1291,8 +1291,11 @@ static void writeGenericDebugNode(raw_os
                                   SlotTracker *Machine, const Module *Context) {
   Out << "!GenericDebugNode(";
   FieldSeparator FS;
-  // Always output the line, since 0 is a relevant and important value for it.
-  Out << FS << "tag: " << N->getTag();
+  Out << FS << "tag: ";
+  if (const char *Tag = dwarf::TagString(N->getTag()))
+    Out << Tag;
+  else
+    Out << N->getTag();
   if (!N->getHeader().empty()) {
     Out << FS << "header: \"";
     PrintEscapedString(N->getHeader(), Out);

Modified: llvm/trunk/test/Assembler/generic-debug-node.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/generic-debug-node.ll?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/test/Assembler/generic-debug-node.ll (original)
+++ llvm/trunk/test/Assembler/generic-debug-node.ll Tue Feb  3 15:56:01 2015
@@ -1,24 +1,27 @@
 ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
 ; RUN: verify-uselistorder %s
 
-; CHECK: !named = !{!0, !1, !1, !2, !2, !2, !2, !3, !4}
-!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8}
+; CHECK: !named = !{!0, !1, !1, !2, !2, !2, !2, !3, !4, !2}
+!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9}
 
 ; CHECK: !0 = !{}
 !0 = !{}
 
-; CHECK-NEXT: !1 = !GenericDebugNode(tag: 3, header: "some\00header", operands: {!0, !2, !2})
+; CHECK-NEXT: !1 = !GenericDebugNode(tag: DW_TAG_entry_point, header: "some\00header", operands: {!0, !2, !2})
 !1 = !GenericDebugNode(tag: 3, header: "some\00header", operands: {!0, !3, !4})
 !2 = !GenericDebugNode(tag: 3, header: "some\00header", operands: {!{}, !3, !4})
 
-; CHECK-NEXT: !2 = !GenericDebugNode(tag: 3)
+; CHECK-NEXT: !2 = !GenericDebugNode(tag: DW_TAG_entry_point)
 !3 = !GenericDebugNode(tag: 3)
 !4 = !GenericDebugNode(tag: 3, header: "")
 !5 = !GenericDebugNode(tag: 3, operands: {})
 !6 = !GenericDebugNode(tag: 3, header: "", operands: {})
 
-; CHECK-NEXT: !3 = distinct !GenericDebugNode(tag: 3)
+; CHECK-NEXT: !3 = distinct !GenericDebugNode(tag: DW_TAG_entry_point)
 !7 = distinct !GenericDebugNode(tag: 3)
 
 ; CHECK-NEXT: !4 = !GenericDebugNode(tag: 65535)
 !8 = !GenericDebugNode(tag: 65535)
+
+; CHECK-NOT: !
+!9 = !GenericDebugNode(tag: DW_TAG_entry_point)

Added: llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-bad.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-bad.ll?rev=228042&view=auto
==============================================================================
--- llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-bad.ll (added)
+++ llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-bad.ll Tue Feb  3 15:56:01 2015
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+; CHECK: <stdin>:[[@LINE+1]]:29: error: invalid DWARF tag 'DW_TAG_badtag'
+!0 = !GenericDebugNode(tag: DW_TAG_badtag)

Added: llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-wrong-type.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-wrong-type.ll?rev=228042&view=auto
==============================================================================
--- llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-wrong-type.ll (added)
+++ llvm/trunk/test/Assembler/invalid-generic-debug-node-tag-wrong-type.ll Tue Feb  3 15:56:01 2015
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
+
+; CHECK: <stdin>:[[@LINE+1]]:29: error: expected DWARF tag
+!0 = !GenericDebugNode(tag: "string")

Modified: llvm/trunk/utils/vim/llvm.vim
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/vim/llvm.vim?rev=228042&r1=228041&r2=228042&view=diff
==============================================================================
--- llvm/trunk/utils/vim/llvm.vim (original)
+++ llvm/trunk/utils/vim/llvm.vim Tue Feb  3 15:56:01 2015
@@ -77,6 +77,7 @@ syn match   llvmIdentifier /[%@][-a-zA-Z
 syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*$/
 syn match   llvmIdentifier /![-a-zA-Z$._][-a-zA-Z$._0-9]*\ze\s*[=!]/
 syn match   llvmType /!\zs\a\+\ze\s*(/
+syn match   llvmConstant /\<DW_TAG_[a-z_]\+\>/
 
 " Syntax-highlight dejagnu test commands.
 syn match  llvmSpecialComment /;\s*RUN:.*$/





More information about the llvm-commits mailing list