<div dir="ltr">Hello Momchil,<br><br>This commits broke the one of our builders on silent master:<br><a href="http://lab.llvm.org:8014/builders/lld-perf-testsuite/builds/1373">http://lab.llvm.org:8014/builders/lld-perf-testsuite/builds/1373</a><br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 12, 2018 at 8:10 AM, Momchil Velikov via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: chill<br>
Date: Mon Feb 12 08:10:09 2018<br>
New Revision: 324899<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=324899&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=324899&view=rev</a><br>
Log:<br>
Re-commit r324489: [DebugInfo] Improvements to representation of enumeration types (PR36168)<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D42734" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D42734</a><br>
<br>
Added:<br>
    llvm/trunk/test/Assembler/<wbr>DIEnumerator.ll<br>
    llvm/trunk/test/DebugInfo/<wbr>Generic/debug-info-enum.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>Bitcode/LLVMBitCodes.h<br>
    llvm/trunk/include/llvm/IR/<wbr>DIBuilder.h<br>
    llvm/trunk/include/llvm/IR/<wbr>DebugInfoFlags.def<br>
    llvm/trunk/include/llvm/IR/<wbr>DebugInfoMetadata.h<br>
    llvm/trunk/lib/AsmParser/<wbr>LLParser.cpp<br>
    llvm/trunk/lib/Bitcode/Reader/<wbr>MetadataLoader.cpp<br>
    llvm/trunk/lib/Bitcode/Writer/<wbr>BitcodeWriter.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfUnit.cpp<br>
    llvm/trunk/lib/IR/AsmWriter.<wbr>cpp<br>
    llvm/trunk/lib/IR/DIBuilder.<wbr>cpp<br>
    llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp<br>
    llvm/trunk/lib/IR/<wbr>LLVMContextImpl.h<br>
    llvm/trunk/test/DebugInfo/X86/<wbr>enum-class.ll<br>
    llvm/trunk/unittests/IR/<wbr>MetadataTest.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Bitcode/LLVMBitCodes.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Bitcode/LLVMBitCodes.h?<wbr>rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Bitcode/LLVMBitCodes.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Bitcode/LLVMBitCodes.h Mon Feb 12 08:10:09 2018<br>
@@ -279,7 +279,7 @@ enum MetadataCodes {<br>
   METADATA_ATTACHMENT = 11,    // [m x [value, [n x [id, mdnode]]]<br>
   METADATA_GENERIC_DEBUG = 12, // [distinct, tag, vers, header, n x md num]<br>
   METADATA_SUBRANGE = 13,      // [distinct, count, lo]<br>
-  METADATA_ENUMERATOR = 14,    // [distinct, value, name]<br>
+  METADATA_ENUMERATOR = 14,    // [isUnsigned|distinct, value, name]<br>
   METADATA_BASIC_TYPE = 15,    // [distinct, tag, name, size, align, enc]<br>
   METADATA_FILE = 16, // [distinct, filename, directory, checksumkind, checksum]<br>
   METADATA_DERIVED_TYPE = 17,       // [distinct, ...]<br>
<br>
Modified: llvm/trunk/include/llvm/IR/<wbr>DIBuilder.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/IR/DIBuilder.h?rev=<wbr>324899&r1=324898&r2=324899&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/IR/<wbr>DIBuilder.h (original)<br>
+++ llvm/trunk/include/llvm/IR/<wbr>DIBuilder.h Mon Feb 12 08:10:09 2018<br>
@@ -166,7 +166,7 @@ namespace llvm {<br>
                                      DIFile *File);<br>
<br>
     /// Create a single enumerator value.<br>
-    DIEnumerator *createEnumerator(StringRef Name, int64_t Val);<br>
+    DIEnumerator *createEnumerator(StringRef Name, int64_t Val, bool IsUnsigned = false);<br>
<br>
     /// Create a DWARF unspecified type.<br>
     DIBasicType *createUnspecifiedType(<wbr>StringRef Name);<br>
@@ -487,10 +487,11 @@ namespace llvm {<br>
     /// \param Elements       Enumeration elements.<br>
     /// \param UnderlyingType Underlying type of a C++11/ObjC fixed enum.<br>
     /// \param UniqueIdentifier A unique identifier for the enum.<br>
+    /// \param IsFixed Boolean flag indicate if this is C++11/ObjC fixed enum.<br>
     DICompositeType *createEnumerationType(<br>
         DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,<br>
         uint64_t SizeInBits, uint32_t AlignInBits, DINodeArray Elements,<br>
-        DIType *UnderlyingType, StringRef UniqueIdentifier = "");<br>
+        DIType *UnderlyingType, StringRef UniqueIdentifier = "", bool IsFixed = false);<br>
<br>
     /// Create subroutine type.<br>
     /// \param ParameterTypes  An array of subroutine parameter types. This<br>
<br>
Modified: llvm/trunk/include/llvm/IR/<wbr>DebugInfoFlags.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoFlags.def?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/IR/DebugInfoFlags.def?<wbr>rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/IR/<wbr>DebugInfoFlags.def (original)<br>
+++ llvm/trunk/include/llvm/IR/<wbr>DebugInfoFlags.def Mon Feb 12 08:10:09 2018<br>
@@ -45,6 +45,7 @@ HANDLE_DI_FLAG((1 << 20), NoReturn)<br>
 HANDLE_DI_FLAG((1 << 21), MainSubprogram)<br>
 HANDLE_DI_FLAG((1 << 22), TypePassByValue)<br>
 HANDLE_DI_FLAG((1 << 23), TypePassByReference)<br>
+HANDLE_DI_FLAG((1 << 24), FixedEnum)<br>
<br>
 // To avoid needing a dedicated value for IndirectVirtualBase, we use<br>
 // the bitwise or of Virtual and FwdDecl, which does not otherwise<br>
@@ -54,7 +55,7 @@ HANDLE_DI_FLAG((1 << 2) | (1 << 5), Indi<br>
 #ifdef DI_FLAG_LARGEST_NEEDED<br>
 // intended to be used with ADT/BitmaskEnum.h<br>
 // NOTE: always must be equal to largest flag, check this when adding new flag<br>
-HANDLE_DI_FLAG((1 << 23), Largest)<br>
+HANDLE_DI_FLAG((1 << 24), Largest)<br>
 #undef DI_FLAG_LARGEST_NEEDED<br>
 #endif<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/IR/<wbr>DebugInfoMetadata.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/IR/DebugInfoMetadata.h?<wbr>rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/IR/<wbr>DebugInfoMetadata.h (original)<br>
+++ llvm/trunk/include/llvm/IR/<wbr>DebugInfoMetadata.h Mon Feb 12 08:10:09 2018<br>
@@ -396,36 +396,38 @@ class DIEnumerator : public DINode {<br>
   friend class MDNode;<br>
<br>
   int64_t Value;<br>
-<br>
   DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value,<br>
-               ArrayRef<Metadata *> Ops)<br>
+               bool IsUnsigned, ArrayRef<Metadata *> Ops)<br>
       : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops),<br>
-        Value(Value) {}<br>
+        Value(Value) {<br>
+    SubclassData32 = IsUnsigned;<br>
+  }<br>
   ~DIEnumerator() = default;<br>
<br>
   static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value,<br>
-                               StringRef Name, StorageType Storage,<br>
-                               bool ShouldCreate = true) {<br>
-    return getImpl(Context, Value, getCanonicalMDString(Context, Name), Storage,<br>
-                   ShouldCreate);<br>
+                               bool IsUnsigned, StringRef Name,<br>
+                               StorageType Storage, bool ShouldCreate = true) {<br>
+    return getImpl(Context, Value, IsUnsigned,<br>
+                   getCanonicalMDString(Context, Name), Storage, ShouldCreate);<br>
   }<br>
   static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value,<br>
-                               MDString *Name, StorageType Storage,<br>
-                               bool ShouldCreate = true);<br>
+                               bool IsUnsigned, MDString *Name,<br>
+                               StorageType Storage, bool ShouldCreate = true);<br>
<br>
   TempDIEnumerator cloneImpl() const {<br>
-    return getTemporary(getContext(), getValue(), getName());<br>
+    return getTemporary(getContext(), getValue(), isUnsigned(), getName());<br>
   }<br>
<br>
 public:<br>
-  DEFINE_MDNODE_GET(<wbr>DIEnumerator, (int64_t Value, StringRef Name),<br>
-                    (Value, Name))<br>
-  DEFINE_MDNODE_GET(<wbr>DIEnumerator, (int64_t Value, MDString *Name),<br>
-                    (Value, Name))<br>
+  DEFINE_MDNODE_GET(<wbr>DIEnumerator, (int64_t Value, bool IsUnsigned, StringRef Name),<br>
+                    (Value, IsUnsigned, Name))<br>
+  DEFINE_MDNODE_GET(<wbr>DIEnumerator, (int64_t Value, bool IsUnsigned, MDString *Name),<br>
+                    (Value, IsUnsigned, Name))<br>
<br>
   TempDIEnumerator clone() const { return cloneImpl(); }<br>
<br>
   int64_t getValue() const { return Value; }<br>
+  bool isUnsigned() const { return SubclassData32; }<br>
   StringRef getName() const { return getStringOperand(0); }<br>
<br>
   MDString *getRawName() const { return getOperandAs<MDString>(0); }<br>
<br>
Modified: llvm/trunk/lib/AsmParser/<wbr>LLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>AsmParser/LLParser.cpp?rev=<wbr>324899&r1=324898&r2=324899&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/AsmParser/<wbr>LLParser.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/<wbr>LLParser.cpp Mon Feb 12 08:10:09 2018<br>
@@ -3636,6 +3636,22 @@ struct MDSignedOrMDField : MDEitherField<br>
   }<br>
 };<br>
<br>
+struct MDSignedOrUnsignedField<br>
+    : MDEitherFieldImpl<<wbr>MDSignedField, MDUnsignedField> {<br>
+  MDSignedOrUnsignedField() : ImplTy(MDSignedField(0), MDUnsignedField(0)) {}<br>
+<br>
+  bool isMDSignedField() const { return WhatIs == IsTypeA; }<br>
+  bool isMDUnsignedField() const { return WhatIs == IsTypeB; }<br>
+  int64_t getMDSignedValue() const {<br>
+    assert(isMDSignedField() && "Wrong field type");<br>
+    return A.Val;<br>
+  }<br>
+  uint64_t getMDUnsignedValue() const {<br>
+    assert(isMDUnsignedField() && "Wrong field type");<br>
+    return B.Val;<br>
+  }<br>
+};<br>
+<br>
 } // end anonymous namespace<br>
<br>
 namespace llvm {<br>
@@ -3913,6 +3929,27 @@ bool LLParser::ParseMDField(LocTy Loc, S<br>
 }<br>
<br>
 template <><br>
+bool LLParser::ParseMDField(LocTy Loc, StringRef Name,<br>
+                            MDSignedOrUnsignedField &Result) {<br>
+  if (Lex.getKind() != lltok::APSInt)<br>
+    return false;<br>
+<br>
+  if (Lex.getAPSIntVal().isSigned()<wbr>) {<br>
+    MDSignedField Res = Result.A;<br>
+    if (ParseMDField(Loc, Name, Res))<br>
+      return true;<br>
+    Result.assign(Res);<br>
+    return false;<br>
+  }<br>
+<br>
+  MDUnsignedField Res = Result.B;<br>
+  if (ParseMDField(Loc, Name, Res))<br>
+    return true;<br>
+  Result.assign(Res);<br>
+  return false;<br>
+}<br>
+<br>
+template <><br>
 bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDStringField &Result) {<br>
   LocTy ValueLoc = Lex.getLoc();<br>
   std::string S;<br>
@@ -4077,15 +4114,24 @@ bool LLParser::ParseDISubrange(<wbr>MDNode *&<br>
 }<br>
<br>
 /// ParseDIEnumerator:<br>
-///   ::= !DIEnumerator(value: 30, name: "SomeKind")<br>
+///   ::= !DIEnumerator(value: 30, isUnsigned: true, name: "SomeKind")<br>
 bool LLParser::ParseDIEnumerator(<wbr>MDNode *&Result, bool IsDistinct) {<br>
 #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)                                    \<br>
   REQUIRED(name, MDStringField, );                                             \<br>
-  REQUIRED(value, MDSignedField, );<br>
+  REQUIRED(value, MDSignedOrUnsignedField, );                                  \<br>
+  OPTIONAL(isUnsigned, MDBoolField, (false));<br>
   PARSE_MD_FIELDS();<br>
 #undef VISIT_MD_FIELDS<br>
<br>
-  Result = GET_OR_DISTINCT(DIEnumerator, (Context, value.Val, name.Val));<br>
+  if (isUnsigned.Val && value.isMDSignedField())<br>
+    return TokError("unsigned enumerator with negative value");<br>
+<br>
+  int64_t Value = value.isMDSignedField()<br>
+                      ? value.getMDSignedValue()<br>
+                      : static_cast<int64_t>(value.<wbr>getMDUnsignedValue());<br>
+  Result =<br>
+      GET_OR_DISTINCT(DIEnumerator, (Context, Value, isUnsigned.Val, name.Val));<br>
+<br>
   return false;<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Reader/<wbr>MetadataLoader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/MetadataLoader.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Bitcode/Reader/MetadataLoader.<wbr>cpp?rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Bitcode/Reader/<wbr>MetadataLoader.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Reader/<wbr>MetadataLoader.cpp Mon Feb 12 08:10:09 2018<br>
@@ -1200,10 +1200,11 @@ Error MetadataLoader::<wbr>MetadataLoaderImpl<br>
     if (Record.size() != 3)<br>
       return error("Invalid record");<br>
<br>
-    IsDistinct = Record[0];<br>
+    IsDistinct = Record[0] & 1;<br>
+    bool IsUnsigned = Record[0] & 2;<br>
     MetadataList.assignValue(<br>
         GET_OR_DISTINCT(DIEnumerator, (Context, unrotateSign(Record[1]),<br>
-                                       getMDString(Record[2]))),<br>
+                                       IsUnsigned, getMDString(Record[2]))),<br>
         NextMetadataNo);<br>
     NextMetadataNo++;<br>
     break;<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Writer/<wbr>BitcodeWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Bitcode/Writer/BitcodeWriter.<wbr>cpp?rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Bitcode/Writer/<wbr>BitcodeWriter.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Writer/<wbr>BitcodeWriter.cpp Mon Feb 12 08:10:09 2018<br>
@@ -1457,7 +1457,7 @@ void ModuleBitcodeWriter::<wbr>writeDISubrang<br>
 void ModuleBitcodeWriter::<wbr>writeDIEnumerator(const DIEnumerator *N,<br>
                                             SmallVectorImpl<uint64_t> &Record,<br>
                                             unsigned Abbrev) {<br>
-  Record.push_back(N-><wbr>isDistinct());<br>
+  Record.push_back((N-><wbr>isUnsigned() << 1) | N->isDistinct());<br>
   Record.push_back(rotateSign(N-<wbr>>getValue()));<br>
   Record.push_back(VE.<wbr>getMetadataOrNullID(N-><wbr>getRawName()));<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfUnit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/DwarfUnit.<wbr>cpp?rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfUnit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfUnit.cpp Mon Feb 12 08:10:09 2018<br>
@@ -1427,6 +1427,15 @@ void DwarfUnit::<wbr>constructArrayTypeDIE(DI<br>
 }<br>
<br>
 void DwarfUnit::<wbr>constructEnumTypeDIE(DIE &Buffer, const DICompositeType *CTy) {<br>
+  const DIType *DTy = resolve(CTy->getBaseType());<br>
+  bool IsUnsigned = DTy && isUnsignedDIType(DD, DTy);<br>
+  if (DTy && DD->getDwarfVersion() >= 3)<br>
+    addType(Buffer, DTy);<br>
+  if (DD->getDwarfVersion() >= 4 && (CTy->getFlags() & DINode::FlagFixedEnum)) {<br>
+    assert(DTy);<br>
+    addFlag(Buffer, dwarf::DW_AT_enum_class);<br>
+  }<br>
+<br>
   DINodeArray Elements = CTy->getElements();<br>
<br>
   // Add enumerators to enumeration type.<br>
@@ -1436,16 +1445,10 @@ void DwarfUnit::<wbr>constructEnumTypeDIE(DIE<br>
       DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_<wbr>enumerator, Buffer);<br>
       StringRef Name = Enum->getName();<br>
       addString(Enumerator, dwarf::DW_AT_name, Name);<br>
-      int64_t Value = Enum->getValue();<br>
-      addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,<br>
-              Value);<br>
+      auto Value = static_cast<uint64_t>(Enum-><wbr>getValue());<br>
+      addConstantValue(Enumerator, IsUnsigned, Value);<br>
     }<br>
   }<br>
-  const DIType *DTy = resolve(CTy->getBaseType());<br>
-  if (DTy) {<br>
-    addType(Buffer, DTy);<br>
-    addFlag(Buffer, dwarf::DW_AT_enum_class);<br>
-  }<br>
 }<br>
<br>
 void DwarfUnit::<wbr>constructContainingTypeDIEs() {<br>
<br>
Modified: llvm/trunk/lib/IR/AsmWriter.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>AsmWriter.cpp?rev=324899&r1=<wbr>324898&r2=324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/AsmWriter.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/IR/AsmWriter.<wbr>cpp Mon Feb 12 08:10:09 2018<br>
@@ -1629,7 +1629,13 @@ static void writeDIEnumerator(raw_ostrea<br>
   Out << "!DIEnumerator(";<br>
   MDFieldPrinter Printer(Out);<br>
   Printer.printString("name", N->getName(), /* ShouldSkipEmpty */ false);<br>
-  Printer.printInt("value", N->getValue(), /* ShouldSkipZero */ false);<br>
+  if (N->isUnsigned()) {<br>
+    auto Value = static_cast<uint64_t>(N-><wbr>getValue());<br>
+    Printer.printInt("value", Value, /* ShouldSkipZero */ false);<br>
+    Printer.printBool("isUnsigned"<wbr>, true);<br>
+  } else {<br>
+    Printer.printInt("value", N->getValue(), /* ShouldSkipZero */ false);<br>
+  }<br>
   Out << ")";<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/IR/DIBuilder.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>DIBuilder.cpp?rev=324899&r1=<wbr>324898&r2=324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/DIBuilder.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/IR/DIBuilder.<wbr>cpp Mon Feb 12 08:10:09 2018<br>
@@ -233,9 +233,10 @@ DIMacroFile *DIBuilder::createTempMacroF<br>
   return MF;<br>
 }<br>
<br>
-DIEnumerator *DIBuilder::createEnumerator(<wbr>StringRef Name, int64_t Val) {<br>
+DIEnumerator *DIBuilder::createEnumerator(<wbr>StringRef Name, int64_t Val,<br>
+                                          bool IsUnsigned) {<br>
   assert(!Name.empty() && "Unable to create enumerator without name");<br>
-  return DIEnumerator::get(VMContext, Val, Name);<br>
+  return DIEnumerator::get(VMContext, Val, IsUnsigned, Name);<br>
 }<br>
<br>
 DIBasicType *DIBuilder::<wbr>createUnspecifiedType(<wbr>StringRef Name) {<br>
@@ -492,11 +493,12 @@ DISubroutineType *DIBuilder::createSubro<br>
 DICompositeType *DIBuilder::<wbr>createEnumerationType(<br>
     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,<br>
     uint64_t SizeInBits, uint32_t AlignInBits, DINodeArray Elements,<br>
-    DIType *UnderlyingType, StringRef UniqueIdentifier) {<br>
+    DIType *UnderlyingType, StringRef UniqueIdentifier, bool IsFixed) {<br>
   auto *CTy = DICompositeType::get(<br>
       VMContext, dwarf::DW_TAG_enumeration_<wbr>type, Name, File, LineNumber,<br>
       getNonCompileUnitScope(Scope), UnderlyingType, SizeInBits, AlignInBits, 0,<br>
-      DINode::FlagZero, Elements, 0, nullptr, nullptr, UniqueIdentifier);<br>
+      IsFixed ? DINode::FlagFixedEnum : DINode::FlagZero, Elements, 0, nullptr,<br>
+      nullptr, UniqueIdentifier);<br>
   AllEnumTypes.push_back(CTy);<br>
   trackIfUnresolved(CTy);<br>
   return CTy;<br>
<br>
Modified: llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp?rev=<wbr>324899&r1=324898&r2=324899&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp Mon Feb 12 08:10:09 2018<br>
@@ -263,12 +263,12 @@ DISubrange *DISubrange::getImpl(LLVMCont<br>
 }<br>
<br>
 DIEnumerator *DIEnumerator::getImpl(<wbr>LLVMContext &Context, int64_t Value,<br>
-                                    MDString *Name, StorageType Storage,<br>
-                                    bool ShouldCreate) {<br>
+                                    bool IsUnsigned, MDString *Name,<br>
+                                    StorageType Storage, bool ShouldCreate) {<br>
   assert(isCanonical(Name) && "Expected canonical MDString");<br>
-  DEFINE_GETIMPL_LOOKUP(<wbr>DIEnumerator, (Value, Name));<br>
+  DEFINE_GETIMPL_LOOKUP(<wbr>DIEnumerator, (Value, IsUnsigned, Name));<br>
   Metadata *Ops[] = {Name};<br>
-  DEFINE_GETIMPL_STORE(<wbr>DIEnumerator, (Value), Ops);<br>
+  DEFINE_GETIMPL_STORE(<wbr>DIEnumerator, (Value, IsUnsigned), Ops);<br>
 }<br>
<br>
 DIBasicType *DIBasicType::getImpl(<wbr>LLVMContext &Context, unsigned Tag,<br>
<br>
Modified: llvm/trunk/lib/IR/<wbr>LLVMContextImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>LLVMContextImpl.h?rev=324899&<wbr>r1=324898&r2=324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/<wbr>LLVMContextImpl.h (original)<br>
+++ llvm/trunk/lib/IR/<wbr>LLVMContextImpl.h Mon Feb 12 08:10:09 2018<br>
@@ -354,13 +354,17 @@ template <> struct MDNodeKeyImpl<DISubra<br>
 template <> struct MDNodeKeyImpl<DIEnumerator> {<br>
   int64_t Value;<br>
   MDString *Name;<br>
+  bool IsUnsigned;<br>
<br>
-  MDNodeKeyImpl(int64_t Value, MDString *Name) : Value(Value), Name(Name) {}<br>
+  MDNodeKeyImpl(int64_t Value, bool IsUnsigned, MDString *Name)<br>
+      : Value(Value), Name(Name), IsUnsigned(IsUnsigned) {}<br>
   MDNodeKeyImpl(const DIEnumerator *N)<br>
-      : Value(N->getValue()), Name(N->getRawName()) {}<br>
+      : Value(N->getValue()), Name(N->getRawName()),<br>
+        IsUnsigned(N->isUnsigned()) {}<br>
<br>
   bool isKeyOf(const DIEnumerator *RHS) const {<br>
-    return Value == RHS->getValue() && Name == RHS->getRawName();<br>
+    return Value == RHS->getValue() && IsUnsigned == RHS->isUnsigned() &&<br>
+           Name == RHS->getRawName();<br>
   }<br>
<br>
   unsigned getHashValue() const { return hash_combine(Value, Name); }<br>
<br>
Added: llvm/trunk/test/Assembler/<wbr>DIEnumerator.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/DIEnumerator.ll?rev=324899&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Assembler/DIEnumerator.ll?rev=<wbr>324899&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Assembler/<wbr>DIEnumerator.ll (added)<br>
+++ llvm/trunk/test/Assembler/<wbr>DIEnumerator.ll Mon Feb 12 08:10:09 2018<br>
@@ -0,0 +1,85 @@<br>
+; Round-trip test for the following program:<br>
+; ```<br>
+; enum E0 {  A0 = -2147483648, B0 = 2147483647 } x0;<br>
+; enum E1 : signed int { A1 = -2147483648, B1 = 2147483647 } x1;<br>
+; enum E2 : signed long long { A2 = -9223372036854775807LL - 1,<br>
+;                              B2 = 9223372036854775807LL } x2;<br>
+; enum E3 : unsigned long long { A3 = 0x8000000000000000ULL } x3;<br>
+; ```<br>
+; Test FixedEnum flag presence/absence, the underlying integer type and<br>
+; enumerator values (signed and unsigned, and extreme cases) all survive through<br>
+; the round-trip.<br>
+<br>
+; RUN: llvm-as %s -o - | llvm-dis | llvm-as | llvm-dis | FileCheck %s<br>
+<br>
+@x0 = global i32 0, align 4, !dbg !0<br>
+@x1 = global i32 0, align 4, !dbg !24<br>
+@x2 = global i64 0, align 8, !dbg !26<br>
+@x3 = global i64 0, align 8, !dbg !28<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!2}<br>
+!llvm.module.flags = !{!30, !31, !32}<br>
+!llvm.ident = !{!33}<br>
+<br>
+!0 = !DIGlobalVariableExpression(<wbr>var: !1, expr: !DIExpression())<br>
+!1 = distinct !DIGlobalVariable(name: "x0", scope: !2, file: !3, line: 1, type: !5, isLocal: false, isDefinition: true)<br>
+!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (/data/src/llvm/tools/clang 697b0cb4c2e712a28767c2f7fe50c9<wbr>0bae7255f5) (/data/src/llvm 5ba8dcca7470b5da405bc92b9681b1<wbr>f36e5d6772)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !23)<br>
+!3 = !DIFile(filename: "e.cc", directory: "/work/build/clang-dev")<br>
+!4 = !{!5, !10, !14, !19}<br>
+<br>
+<br>
+!5 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E0", file: !3, line: 1, baseType: !6, size: 32, elements: !7, identifier: "_ZTS2E0")<br>
+; CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E0"{{.*}}, baseType: ![[INT:[0-9]+]]<br>
+; CHECK-NOT: FixedEnum<br>
+!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+; CHECK: ![[INT]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!7 = !{!8, !9}<br>
+!8 = !DIEnumerator(name: "A0", value: -2147483648)<br>
+!9 = !DIEnumerator(name: "B0", value: 2147483647)<br>
+; CHECK: !DIEnumerator(name: "A0", value: -2147483648)<br>
+; CHECK: !DIEnumerator(name: "B0", value: 2147483647)<br>
+<br>
+<br>
+!10 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E1", file: !3, line: 3, baseType: !6, size: 32, flags: DIFlagFixedEnum, elements: !11, identifier: "_ZTS2E1")<br>
+; CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E1"{{.*}}, baseType: ![[INT]]<br>
+; CHECK-SAME: DIFlagFixedEnum<br>
+!11 = !{!12, !13}<br>
+!12 = !DIEnumerator(name: "A1", value: -2147483648)<br>
+!13 = !DIEnumerator(name: "B1", value: 2147483647)<br>
+; CHECK: !DIEnumerator(name: "A1", value: -2147483648)<br>
+; CHECK: !DIEnumerator(name: "B1", value: 2147483647)<br>
+<br>
+<br>
+!14 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E2", file: !3, line: 5, baseType: !15, size: 64, flags: DIFlagFixedEnum, elements: !16, identifier: "_ZTS2E2")<br>
+; CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E2"{{.*}}, baseType: ![[LONG:[0-9]+]]<br>
+; CHECK-SAME: DIFlagFixedEnum<br>
+!15 = !DIBasicType(name: "long long int", size: 64, encoding: DW_ATE_signed)<br>
+; CHECK: ![[LONG]] = !DIBasicType(name: "long long int", size: 64, encoding: DW_ATE_signed)<br>
+!16 = !{!17, !18}<br>
+!17 = !DIEnumerator(name: "A2", value: -9223372036854775808)<br>
+!18 = !DIEnumerator(name: "B2", value: 9223372036854775807)<br>
+; CHECK: !DIEnumerator(name: "A2", value: -9223372036854775808)<br>
+; CHECK: !DIEnumerator(name: "B2", value: 9223372036854775807)<br>
+<br>
+<br>
+!19 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E3", file: !3, line: 7, baseType: !20, size: 64, flags: DIFlagFixedEnum, elements: !21, identifier: "_ZTS2E3")<br>
+; CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "E3"{{.*}}, baseType: ![[ULONG:[0-9]+]]<br>
+; CHECK-SAME: DIFlagFixedEnum<br>
+!20 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned)<br>
+; CHECK: ![[ULONG]] = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned)<br>
+!21 = !{!22}<br>
+!22 = !DIEnumerator(name: "A3", value: 9223372036854775808, isUnsigned: true)<br>
+; CHECK: !DIEnumerator(name: "A3", value: 9223372036854775808, isUnsigned: true)<br>
+<br>
+<br>
+!23 = !{!0, !24, !26, !28}<br>
+!24 = !DIGlobalVariableExpression(<wbr>var: !25, expr: !DIExpression())<br>
+!25 = distinct !DIGlobalVariable(name: "x1", scope: !2, file: !3, line: 3, type: !10, isLocal: false, isDefinition: true)<br>
+!26 = !DIGlobalVariableExpression(<wbr>var: !27, expr: !DIExpression())<br>
+!27 = distinct !DIGlobalVariable(name: "x2", scope: !2, file: !3, line: 5, type: !14, isLocal: false, isDefinition: true)<br>
+!28 = !DIGlobalVariableExpression(<wbr>var: !29, expr: !DIExpression())<br>
+!29 = distinct !DIGlobalVariable(name: "x3", scope: !2, file: !3, line: 7, type: !19, isLocal: false, isDefinition: true)<br>
+!30 = !{i32 2, !"Dwarf Version", i32 4}<br>
+!31 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!32 = !{i32 1, !"wchar_size", i32 4}<br>
+!33 = !{!"clang version 7.0.0 (/data/src/llvm/tools/clang 697b0cb4c2e712a28767c2f7fe50c9<wbr>0bae7255f5) (/data/src/llvm 5ba8dcca7470b5da405bc92b9681b1<wbr>f36e5d6772)"}<br>
<br>
Added: llvm/trunk/test/DebugInfo/<wbr>Generic/debug-info-enum.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/debug-info-enum.ll?rev=324899&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>DebugInfo/Generic/debug-info-<wbr>enum.ll?rev=324899&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/DebugInfo/<wbr>Generic/debug-info-enum.ll (added)<br>
+++ llvm/trunk/test/DebugInfo/<wbr>Generic/debug-info-enum.ll Mon Feb 12 08:10:09 2018<br>
@@ -0,0 +1,188 @@<br>
+; Test enumeration representation in DWARF debug info:<br>
+; * test value representation for each possible underlying integer type<br>
+; * test the integer type is as expected<br>
+; * test the DW_AT_enum_class attribute is present (resp. absent) as expected.<br>
+<br>
+; RUN: llc -debugger-tune=gdb -dwarf-version=4 -filetype=obj -o %t.o < %s<br>
+; RUN: llvm-dwarfdump -debug-info %t.o | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-DW4<br>
+; RUN: llc -debugger-tune=gdb -dwarf-version=2 -filetype=obj -o %t.o < %s<br>
+; RUN: llvm-dwarfdump -debug-info %t.o | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-DW2<br>
+<br>
+@x0 = global i8 0, align 1, !dbg !0<br>
+@x1 = global i8 0, align 1, !dbg !46<br>
+@x2 = global i16 0, align 2, !dbg !48<br>
+@x3 = global i16 0, align 2, !dbg !50<br>
+@x4 = global i32 0, align 4, !dbg !52<br>
+@x5 = global i32 0, align 4, !dbg !54<br>
+@x6 = global i64 0, align 8, !dbg !56<br>
+@x7 = global i64 0, align 8, !dbg !58<br>
+@x8 = global i32 0, align 4, !dbg !60<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!2}<br>
+!llvm.module.flags = !{!62}<br>
+<br>
+!0 = !DIGlobalVariableExpression(<wbr>var: !1, expr: !DIExpression())<br>
+!1 = distinct !DIGlobalVariable(name: "x0", scope: !2, file: !3, line: 5, type: !5, isLocal: false, isDefinition: true)<br>
+!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 7.0.0 (/data/src/llvm/tools/clang 0c08d9830124a75675348b4eeb4725<wbr>6f3da6693d) (/data/src/llvm cf29510f52faa77b98510cd53276f5<wbr>64d1f4f41f)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !45)<br>
+!3 = !DIFile(filename: "/data/src/llvm-dev/tools/<wbr>clang/test/CodeGen/debug-info-<wbr>enum.cpp", directory: "/work/build/clang-dev")<br>
+!4 = !{!5, !10, !14, !19, !23, !28, !32, !37, !41}<br>
+<br>
+; Test enumeration with a fixed "signed char" underlying type.<br>
+!5 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E0", file: !3, line: 2, baseType: !6, size: 8, flags: DIFlagFixedEnum, elements: !7, identifier: "_ZTS2E0")<br>
+!6 = !DIBasicType(name: "signed char", size: 8, encoding: DW_ATE_signed_char)<br>
+!7 = !{!8, !9}<br>
+!8 = !DIEnumerator(name: "A0", value: -128)<br>
+!9 = !DIEnumerator(name: "B0", value: 127)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"signed char"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E0")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A0")<br>
+; CHECK-NEXT:      DW_AT_const_value     (-128)<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("B0")<br>
+; CHECK-NEXT:      DW_AT_const_value     (127)<br>
+<br>
+; Test enumeration with a fixed "unsigned char" underlying type.<br>
+!10 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E1", file: !3, line: 12, baseType: !11, size: 8, flags: DIFlagFixedEnum, elements: !12, identifier: "_ZTS2E1")<br>
+!11 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)<br>
+!12 = !{!13}<br>
+!13 = !DIEnumerator(name: "A1", value: 255, isUnsigned: true)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"unsigned char"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E1")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A1")<br>
+; CHECK-NEXT:      DW_AT_const_value     (255)<br>
+<br>
+; Test enumeration with a fixed "short" underlying type.<br>
+!14 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E2", file: !3, line: 18, baseType: !15, size: 16, flags: DIFlagFixedEnum, elements: !16, identifier: "_ZTS2E2")<br>
+!15 = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)<br>
+!16 = !{!17, !18}<br>
+!17 = !DIEnumerator(name: "A2", value: -32768)<br>
+!18 = !DIEnumerator(name: "B2", value: 32767)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}} "short"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E2")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A2")<br>
+; CHECK-NEXT:      DW_AT_const_value     (-32768)<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("B2")<br>
+; CHECK-NEXT:      DW_AT_const_value     (32767)<br>
+<br>
+; Test enumeration with a fixed "unsigned short" underlying type.<br>
+!19 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E3", file: !3, line: 28, baseType: !20, size: 16, flags: DIFlagFixedEnum, elements: !21, identifier: "_ZTS2E3")<br>
+!20 = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)<br>
+!21 = !{!22}<br>
+!22 = !DIEnumerator(name: "A3", value: 65535, isUnsigned: true)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"unsigned short"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E3")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A3")<br>
+; CHECK-NEXT:      DW_AT_const_value     (65535)<br>
+<br>
+; Test enumeration with a fixed "int" underlying type.<br>
+!23 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E4", file: !3, line: 34, baseType: !24, size: 32, flags: DIFlagFixedEnum, elements: !25, identifier: "_ZTS2E4")<br>
+!24 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!25 = !{!26, !27}<br>
+!26 = !DIEnumerator(name: "A4", value: -2147483648)<br>
+!27 = !DIEnumerator(name: "B4", value: 2147483647)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"int"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E4")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A4")<br>
+; CHECK-NEXT:      DW_AT_const_value     (-2147483648)<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("B4")<br>
+; CHECK-NEXT:      DW_AT_const_value     (2147483647)<br>
+<br>
+; Test enumeration with a fixed "unsigend int" underlying type.<br>
+!28 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E5", file: !3, line: 41, baseType: !29, size: 32, flags: DIFlagFixedEnum, elements: !30, identifier: "_ZTS2E5")<br>
+!29 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)<br>
+!30 = !{!31}<br>
+!31 = !DIEnumerator(name: "A5", value: 4294967295, isUnsigned: true)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"unsigned int"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E5")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A5")<br>
+; CHECK-NEXT:      DW_AT_const_value     (4294967295)<br>
+<br>
+; Test enumeration with a fixed "long long" underlying type.<br>
+!32 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E6", file: !3, line: 47, baseType: !33, size: 64, flags: DIFlagFixedEnum, elements: !34, identifier: "_ZTS2E6")<br>
+!33 = !DIBasicType(name: "long long int", size: 64, encoding: DW_ATE_signed)<br>
+!34 = !{!35, !36}<br>
+!35 = !DIEnumerator(name: "A6", value: -9223372036854775808)<br>
+!36 = !DIEnumerator(name: "B6", value: 9223372036854775807)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"long long int"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E6")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A6")<br>
+; CHECK-NEXT:      DW_AT_const_value     (-9223372036854775808)<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("B6")<br>
+; CHECK-NEXT:      DW_AT_const_value     (9223372036854775807)<br>
+<br>
+; Test enumeration with a fixed "unsigned long long" underlying type.<br>
+!37 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E7", file: !3, line: 57, baseType: !38, size: 64, flags: DIFlagFixedEnum, elements: !39, identifier: "_ZTS2E7")<br>
+!38 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned)<br>
+!39 = !{!40}<br>
+!40 = !DIEnumerator(name: "A7", value: 18446744073709551615, isUnsigned: true)<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"long long unsigned int"<br>
+; CHECK-DW4:       DW_AT_enum_class        (true)<br>
+; CHECK:           DW_AT_name      ("E7")<br>
+; CHECK:         DW_TAG_enumerator<br>
+; CHECK:           DW_AT_name    ("A7")<br>
+; CHECK-NEXT:      DW_AT_const_value     (18446744073709551615)<br>
+<br>
+; Test enumeration without a fixed underlying type. The underlying type should<br>
+; still be present (for DWARF >= 3), but the DW_AT_enum_class attribute should<br>
+; be absent.<br>
+!41 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E8", file: !3, line: 63, baseType: !24, size: 32, elements: !42, identifier: "_ZTS2E8")<br>
+!42 = !{!43, !44}<br>
+!43 = !DIEnumerator(name: "A8", value: -128)<br>
+!44 = !DIEnumerator(name: "B8", value: 127)<br>
+!45 = !{!0, !46, !48, !50, !52, !54, !56, !58, !60}<br>
+; CHECK:         DW_TAG_enumeration_type<br>
+; CHECK-DW2-NOT:   DW_AT_type<br>
+; CHECK-DW4:       DW_AT_type{{.*}}"int"<br>
+; CHECK-NOT:       DW_AT_enum_class<br>
+; CHECK:           DW_AT_name      ("E8")<br>
+<br>
+!46 = !DIGlobalVariableExpression(<wbr>var: !47, expr: !DIExpression())<br>
+!47 = distinct !DIGlobalVariable(name: "x1", scope: !2, file: !3, line: 12, type: !10, isLocal: false, isDefinition: true)<br>
+!48 = !DIGlobalVariableExpression(<wbr>var: !49, expr: !DIExpression())<br>
+!49 = distinct !DIGlobalVariable(name: "x2", scope: !2, file: !3, line: 21, type: !14, isLocal: false, isDefinition: true)<br>
+!50 = !DIGlobalVariableExpression(<wbr>var: !51, expr: !DIExpression())<br>
+!51 = distinct !DIGlobalVariable(name: "x3", scope: !2, file: !3, line: 28, type: !19, isLocal: false, isDefinition: true)<br>
+!52 = !DIGlobalVariableExpression(<wbr>var: !53, expr: !DIExpression())<br>
+!53 = distinct !DIGlobalVariable(name: "x4", scope: !2, file: !3, line: 34, type: !23, isLocal: false, isDefinition: true)<br>
+!54 = !DIGlobalVariableExpression(<wbr>var: !55, expr: !DIExpression())<br>
+!55 = distinct !DIGlobalVariable(name: "x5", scope: !2, file: !3, line: 41, type: !28, isLocal: false, isDefinition: true)<br>
+!56 = !DIGlobalVariableExpression(<wbr>var: !57, expr: !DIExpression())<br>
+!57 = distinct !DIGlobalVariable(name: "x6", scope: !2, file: !3, line: 50, type: !32, isLocal: false, isDefinition: true)<br>
+!58 = !DIGlobalVariableExpression(<wbr>var: !59, expr: !DIExpression())<br>
+!59 = distinct !DIGlobalVariable(name: "x7", scope: !2, file: !3, line: 57, type: !37, isLocal: false, isDefinition: true)<br>
+!60 = !DIGlobalVariableExpression(<wbr>var: !61, expr: !DIExpression())<br>
+!61 = distinct !DIGlobalVariable(name: "x8", scope: !2, file: !3, line: 63, type: !41, isLocal: false, isDefinition: true)<br>
+!62 = !{i32 2, !"Debug Info Version", i32 3}<br>
<br>
Modified: llvm/trunk/test/DebugInfo/X86/<wbr>enum-class.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/enum-class.ll?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>DebugInfo/X86/enum-class.ll?<wbr>rev=324899&r1=324898&r2=<wbr>324899&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/DebugInfo/X86/<wbr>enum-class.ll (original)<br>
+++ llvm/trunk/test/DebugInfo/X86/<wbr>enum-class.ll Mon Feb 12 08:10:09 2018<br>
@@ -13,13 +13,13 @@ source_filename = "test/DebugInfo/X86/en<br>
 !0 = !DIGlobalVariableExpression(<wbr>var: !1, expr: !DIExpression())<br>
 !1 = !DIGlobalVariable(name: "a", scope: null, file: !2, line: 4, type: !3, isLocal: false, isDefinition: true)<br>
 !2 = !DIFile(filename: "foo.cpp", directory: "/Users/echristo/tmp")<br>
-!3 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "A", file: !2, line: 1, baseType: !4, size: 32, align: 32, elements: !5)<br>
+!3 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "A", file: !2, line: 1, baseType: !4, size: 32, flags: DIFlagFixedEnum, align: 32, elements: !5)<br>
 !4 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)<br>
 !5 = !{!6}<br>
 !6 = !DIEnumerator(name: "A1", value: 1)<br>
 !7 = !DIGlobalVariableExpression(<wbr>var: !8, expr: !DIExpression()) ; [ DW_TAG_enumerator ]<br>
 !8 = !DIGlobalVariable(name: "b", scope: null, file: !2, line: 5, type: !9, isLocal: false, isDefinition: true)<br>
-!9 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "B", file: !2, line: 2, baseType: !10, size: 64, align: 64, elements: !11)<br>
+!9 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "B", file: !2, line: 2, baseType: !10, size: 64, flags: DIFlagFixedEnum, align: 64, elements: !11)<br>
 !10 = !DIBasicType(name: "long unsigned int", size: 64, align: 64, encoding: DW_ATE_unsigned)<br>
 !11 = !{!12}<br>
 !12 = !DIEnumerator(name: "B1", value: 1) ; [ DW_TAG_enumerator ]<br>
@@ -44,6 +44,6 @@ source_filename = "test/DebugInfo/X86/en<br>
 ; CHECK: DW_AT_enum_class [DW_FORM_flag_present] (true)<br>
 ; CHECK: DW_AT_name [DW_FORM_strp]          ( .debug_str[{{.*}}] = "B")<br>
<br>
-; CHECK: DW_TAG_enumeration_type [6]<br>
+; CHECK: DW_TAG_enumeration_type<br>
 ; CHECK-NOT: DW_AT_enum_class<br>
 ; CHECK: DW_AT_name [DW_FORM_strp]      ( .debug_str[{{.*}}] = "C")<br>
<br>
Modified: llvm/trunk/unittests/IR/<wbr>MetadataTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=324899&r1=324898&r2=324899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>IR/MetadataTest.cpp?rev=<wbr>324899&r1=324898&r2=324899&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/IR/<wbr>MetadataTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/<wbr>MetadataTest.cpp Mon Feb 12 08:10:09 2018<br>
@@ -978,14 +978,16 @@ TEST_F(DISubrangeTest, getVariableCount)<br>
 typedef MetadataTest DIEnumeratorTest;<br>
<br>
 TEST_F(DIEnumeratorTest, get) {<br>
-  auto *N = DIEnumerator::get(Context, 7, "name");<br>
+  auto *N = DIEnumerator::get(Context, 7, false, "name");<br>
   EXPECT_EQ(dwarf::DW_TAG_<wbr>enumerator, N->getTag());<br>
   EXPECT_EQ(7, N->getValue());<br>
+  EXPECT_EQ(false, N->isUnsigned());<br>
   EXPECT_EQ("name", N->getName());<br>
-  EXPECT_EQ(N, DIEnumerator::get(Context, 7, "name"));<br>
+  EXPECT_EQ(N, DIEnumerator::get(Context, 7, false, "name"));<br>
<br>
-  EXPECT_NE(N, DIEnumerator::get(Context, 8, "name"));<br>
-  EXPECT_NE(N, DIEnumerator::get(Context, 7, "nam"));<br>
+  EXPECT_NE(N, DIEnumerator::get(Context, 7, true, "name"));<br>
+  EXPECT_NE(N, DIEnumerator::get(Context, 8, false, "name"));<br>
+  EXPECT_NE(N, DIEnumerator::get(Context, 7, false, "nam"));<br>
<br>
   TempDIEnumerator Temp = N->clone();<br>
   EXPECT_EQ(N, MDNode::replaceWithUniqued(<wbr>std::move(Temp)));<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>