[llvm] r284678 - DebugInfo: preparation to implement DW_AT_alignment

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 20 16:03:28 PDT 2016


Hi Victor, can you please also update the Go bindings?

# llvm.org/llvm/bindings/go/llvm
[...]/llvm/bindings/go/llvm/DIBuilderBindings.cpp:113:65: error: too many
arguments to function call, expected 3, have 4
[...]/llvm/include/llvm/IR/DIBuilder.h:124:5: note: 'createBasicType'
declared here


On Wed, Oct 19, 2016 at 5:13 PM, Victor Leschuk via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: vleschuk
> Date: Wed Oct 19 19:13:12 2016
> New Revision: 284678
>
> URL: http://llvm.org/viewvc/llvm-project?rev=284678&view=rev
> Log:
> DebugInfo: preparation to implement DW_AT_alignment
>
>  - Add alignment attribute to DIVariable family
>  - Modify bitcode format to match new DIVariable representation
>  - Update tests to match these changes (also add bitcode upgrade test)
>  - Expect that frontend passes non-zero align value only when it is not
> default
>    (was forcibly aligned by alignas()/_Alignas()/__atribute__(aligned())
>
> Differential Revision: https://reviews.llvm.org/D25073
>
> Added:
>     llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll
>     llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll.bc
> Modified:
>     llvm/trunk/include/llvm/IR/DIBuilder.h
>     llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
>     llvm/trunk/lib/AsmParser/LLParser.cpp
>     llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>     llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>     llvm/trunk/lib/IR/AsmWriter.cpp
>     llvm/trunk/lib/IR/DIBuilder.cpp
>     llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>     llvm/trunk/lib/IR/LLVMContextImpl.h
>     llvm/trunk/test/Assembler/diglobalvariable.ll
>     llvm/trunk/test/Assembler/dilocalvariable.ll
>     llvm/trunk/test/DebugInfo/AArch64/bitfields.ll
>     llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll
>     llvm/trunk/test/DebugInfo/COFF/bitfields.ll
>     llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll
>     llvm/trunk/test/DebugInfo/X86/bitfields.ll
>     llvm/trunk/test/DebugInfo/X86/debug-info-packed-struct.ll
>     llvm/trunk/unittests/IR/MetadataTest.cpp
>     llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
>
> Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/DIBuilder.h?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
> +++ llvm/trunk/include/llvm/IR/DIBuilder.h Wed Oct 19 19:13:12 2016
> @@ -120,10 +120,9 @@ namespace llvm {
>      /// type.
>      /// \param Name        Type name.
>      /// \param SizeInBits  Size of the type.
> -    /// \param AlignInBits Type alignment.
>      /// \param Encoding    DWARF encoding code, e.g. dwarf::DW_ATE_float.
>      DIBasicType *createBasicType(StringRef Name, uint64_t SizeInBits,
> -                                 uint32_t AlignInBits, unsigned Encoding);
> +                                 unsigned Encoding);
>
>      /// Create debugging information entry for a qualified
>      /// type, e.g. 'const int'.
> @@ -209,7 +208,7 @@ namespace llvm {
>      /// \param Ty                  Parent type.
>      DIDerivedType *createBitFieldMemberType(
>          DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo,
> -        uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
> +        uint64_t SizeInBits, uint64_t OffsetInBits,
>          uint64_t StorageOffsetInBits, DINode::DIFlags Flags, DIType *Ty);
>
>      /// Create debugging information entry for a
> @@ -221,10 +220,12 @@ namespace llvm {
>      /// \param Ty         Type of the static member.
>      /// \param Flags      Flags to encode member attribute, e.g. private.
>      /// \param Val        Const initializer of the member.
> +    /// \param AlignInBits  Member alignment.
>      DIDerivedType *createStaticMemberType(DIScope *Scope, StringRef Name,
>                                            DIFile *File, unsigned LineNo,
>                                            DIType *Ty, DINode::DIFlags
> Flags,
> -                                          llvm::Constant *Val);
> +                                          llvm::Constant *Val,
> +                                          uint32_t AlignInBits = 0);
>
>      /// Create debugging information entry for Objective-C
>      /// instance variable.
> @@ -458,19 +459,22 @@ namespace llvm {
>      /// \param Expr        The location of the global relative to the
> attached
>      ///                    GlobalVariable.
>      /// \param Decl        Reference to the corresponding declaration.
> +    /// \param AlignInBits Variable alignment(or 0 if no alignment attr
> was
> +    ///                    specified)
>      DIGlobalVariable *createGlobalVariable(DIScope *Context, StringRef
> Name,
>                                             StringRef LinkageName, DIFile
> *File,
>                                             unsigned LineNo, DIType *Ty,
>                                             bool isLocalToUnit,
>                                             DIExpression *Expr = nullptr,
> -                                           MDNode *Decl = nullptr);
> +                                           MDNode *Decl = nullptr,
> +                                           uint32_t AlignInBits = 0);
>
>      /// Identical to createGlobalVariable
>      /// except that the resulting DbgNode is temporary and meant to be
> RAUWed.
>      DIGlobalVariable *createTempGlobalVariableFwdDecl(
>          DIScope *Context, StringRef Name, StringRef LinkageName, DIFile
> *File,
>          unsigned LineNo, DIType *Ty, bool isLocalToUnit, DIExpression
> *Expr,
> -        MDNode *Decl = nullptr);
> +        MDNode *Decl = nullptr, uint32_t AlignInBits = 0);
>
>      /// Create a new descriptor for an auto variable.  This is a local
> variable
>      /// that is not a subprogram parameter.
> @@ -483,7 +487,8 @@ namespace llvm {
>      DILocalVariable *
>      createAutoVariable(DIScope *Scope, StringRef Name, DIFile *File,
>                         unsigned LineNo, DIType *Ty, bool AlwaysPreserve =
> false,
> -                       DINode::DIFlags Flags = DINode::FlagZero);
> +                       DINode::DIFlags Flags = DINode::FlagZero,
> +                       uint32_t AlignInBits = 0);
>
>      /// Create a new descriptor for a parameter variable.
>      ///
>
> Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/DebugInfoMetadata.h?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
> +++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Wed Oct 19 19:13:12
> 2016
> @@ -549,7 +549,8 @@ public:
>
>    unsigned getLine() const { return Line; }
>    uint64_t getSizeInBits() const { return SizeInBits; }
> -  uint64_t getAlignInBits() const { return AlignInBits; }
> +  uint32_t getAlignInBits() const { return AlignInBits; }
> +  uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
>    uint64_t getOffsetInBits() const { return OffsetInBits; }
>    DIFlags getFlags() const { return Flags; }
>
> @@ -1826,11 +1827,13 @@ public:
>  /// \brief Base class for variables.
>  class DIVariable : public DINode {
>    unsigned Line;
> +  uint64_t AlignInBits;
>
>  protected:
>    DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned
> Line,
> -             ArrayRef<Metadata *> Ops)
> -      : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line) {}
> +             ArrayRef<Metadata *> Ops, uint64_t AlignInBits = 0)
> +      : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line),
> +             AlignInBits(AlignInBits) {}
>    ~DIVariable() = default;
>
>  public:
> @@ -1839,6 +1842,8 @@ public:
>    StringRef getName() const { return getStringOperand(1); }
>    DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
>    DITypeRef getType() const { return DITypeRef(getRawType()); }
> +  uint64_t getAlignInBits() const { return AlignInBits; }
> +  uint64_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
>
>    StringRef getFilename() const {
>      if (auto *F = getFile())
> @@ -2026,9 +2031,9 @@ class DIGlobalVariable : public DIVariab
>    bool IsDefinition;
>
>    DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
> -                   bool IsLocalToUnit, bool IsDefinition,
> +                   bool IsLocalToUnit, bool IsDefinition, uint64_t
> AlignInBits,
>                     ArrayRef<Metadata *> Ops)
> -      : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops),
> +      : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops,
> AlignInBits),
>          IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
>    ~DIGlobalVariable() = default;
>
> @@ -2036,42 +2041,48 @@ class DIGlobalVariable : public DIVariab
>    getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
>            StringRef LinkageName, DIFile *File, unsigned Line, DITypeRef
> Type,
>            bool IsLocalToUnit, bool IsDefinition, DIExpression *Expr,
> -          DIDerivedType *StaticDataMemberDeclaration, StorageType Storage,
> -          bool ShouldCreate = true) {
> +          DIDerivedType *StaticDataMemberDeclaration, uint64_t
> AlignInBits,
> +          StorageType Storage, bool ShouldCreate = true) {
>      return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
>                     getCanonicalMDString(Context, LinkageName), File,
> Line, Type,
>                     IsLocalToUnit, IsDefinition, Expr,
> -                   StaticDataMemberDeclaration, Storage, ShouldCreate);
> +                   StaticDataMemberDeclaration, AlignInBits, Storage,
> +                   ShouldCreate);
>    }
>    static DIGlobalVariable *
>    getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
>            MDString *LinkageName, Metadata *File, unsigned Line, Metadata
> *Type,
>            bool IsLocalToUnit, bool IsDefinition, Metadata *Expr,
> -          Metadata *StaticDataMemberDeclaration, StorageType Storage,
> -          bool ShouldCreate = true);
> +          Metadata *StaticDataMemberDeclaration, uint64_t AlignInBits,
> +          StorageType Storage, bool ShouldCreate = true);
>
>    TempDIGlobalVariable cloneImpl() const {
>      return getTemporary(getContext(), getScope(), getName(),
> getLinkageName(),
>                          getFile(), getLine(), getType(), isLocalToUnit(),
>                          isDefinition(), getExpr(),
> -                        getStaticDataMemberDeclaration());
> +                        getStaticDataMemberDeclaration(),
> getAlignInBits());
>    }
>
>  public:
>    DEFINE_MDNODE_GET(DIGlobalVariable,
>                      (DIScope * Scope, StringRef Name, StringRef
> LinkageName,
>                       DIFile *File, unsigned Line, DITypeRef Type,
> -                     bool IsLocalToUnit, bool IsDefinition, DIExpression
> *Expr,
> -                     DIDerivedType *StaticDataMemberDeclaration),
> +                     bool IsLocalToUnit, bool IsDefinition,
> +                     DIExpression *Expr,
> +                     DIDerivedType *StaticDataMemberDeclaration,
> +                     uint64_t AlignInBits),
>                      (Scope, Name, LinkageName, File, Line, Type,
> IsLocalToUnit,
> -                     IsDefinition, Expr, StaticDataMemberDeclaration))
> +                     IsDefinition, Expr, StaticDataMemberDeclaration,
> +                     AlignInBits))
>    DEFINE_MDNODE_GET(DIGlobalVariable,
>                      (Metadata * Scope, MDString *Name, MDString
> *LinkageName,
>                       Metadata *File, unsigned Line, Metadata *Type,
> -                     bool IsLocalToUnit, bool IsDefinition, Metadata
> *Expr,
> -                     Metadata *StaticDataMemberDeclaration),
> +                     bool IsLocalToUnit, bool IsDefinition,
> +                     Metadata *Expr, Metadata
> *StaticDataMemberDeclaration,
> +                     uint64_t AlignInBits),
>                      (Scope, Name, LinkageName, File, Line, Type,
> IsLocalToUnit,
> -                     IsDefinition, Expr, StaticDataMemberDeclaration))
> +                     IsDefinition, Expr, StaticDataMemberDeclaration,
> +                     AlignInBits))
>
>    TempDIGlobalVariable clone() const { return cloneImpl(); }
>
> @@ -2109,9 +2120,10 @@ class DILocalVariable : public DIVariabl
>    DIFlags Flags;
>
>    DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
> -                  unsigned Arg, DIFlags Flags, ArrayRef<Metadata *> Ops)
> -      : DIVariable(C, DILocalVariableKind, Storage, Line, Ops), Arg(Arg),
> -        Flags(Flags) {
> +                  unsigned Arg, DIFlags Flags, uint64_t AlignInBits,
> +                  ArrayRef<Metadata *> Ops)
> +      : DIVariable(C, DILocalVariableKind, Storage, Line, Ops,
> AlignInBits),
> +        Arg(Arg), Flags(Flags) {
>      assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
>    }
>    ~DILocalVariable() = default;
> @@ -2119,33 +2131,34 @@ class DILocalVariable : public DIVariabl
>    static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
>                                    StringRef Name, DIFile *File, unsigned
> Line,
>                                    DITypeRef Type, unsigned Arg, DIFlags
> Flags,
> -                                  StorageType Storage,
> +                                  uint64_t AlignInBits, StorageType
> Storage,
>                                    bool ShouldCreate = true) {
>      return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
> File,
> -                   Line, Type, Arg, Flags, Storage, ShouldCreate);
> +                   Line, Type, Arg, Flags, AlignInBits, Storage,
> ShouldCreate);
>    }
>    static DILocalVariable *getImpl(LLVMContext &Context, Metadata *Scope,
>                                    MDString *Name, Metadata *File,
> unsigned Line,
>                                    Metadata *Type, unsigned Arg, DIFlags
> Flags,
> -                                  StorageType Storage,
> +                                  uint64_t AlignInBits, StorageType
> Storage,
>                                    bool ShouldCreate = true);
>
>    TempDILocalVariable cloneImpl() const {
>      return getTemporary(getContext(), getScope(), getName(), getFile(),
> -                        getLine(), getType(), getArg(), getFlags());
> +                        getLine(), getType(), getArg(), getFlags(),
> +                        getAlignInBits());
>    }
>
>  public:
>    DEFINE_MDNODE_GET(DILocalVariable,
>                      (DILocalScope * Scope, StringRef Name, DIFile *File,
>                       unsigned Line, DITypeRef Type, unsigned Arg,
> -                     DIFlags Flags),
> -                    (Scope, Name, File, Line, Type, Arg, Flags))
> +                     DIFlags Flags, uint64_t AlignInBits),
> +                    (Scope, Name, File, Line, Type, Arg, Flags,
> AlignInBits))
>    DEFINE_MDNODE_GET(DILocalVariable,
>                      (Metadata * Scope, MDString *Name, Metadata *File,
>                       unsigned Line, Metadata *Type, unsigned Arg,
> -                     DIFlags Flags),
> -                    (Scope, Name, File, Line, Type, Arg, Flags))
> +                     DIFlags Flags, uint64_t AlignInBits),
> +                    (Scope, Name, File, Line, Type, Arg, Flags,
> AlignInBits))
>
>    TempDILocalVariable clone() const { return cloneImpl(); }
>
>
> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> AsmParser/LLParser.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Wed Oct 19 19:13:12 2016
> @@ -4186,7 +4186,7 @@ bool LLParser::ParseDITemplateValueParam
>  ///   ::= !DIGlobalVariable(scope: !0, name: "foo", linkageName: "foo",
>  ///                         file: !1, line: 7, type: !2, isLocal: false,
>  ///                         isDefinition: true, variable: i32* @foo,
> -///                         declaration: !3)
> +///                         declaration: !3, align: 8)
>  bool LLParser::ParseDIGlobalVariable(MDNode *&Result, bool IsDistinct) {
>  #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)
>       \
>    REQUIRED(name, MDStringField, (/* AllowEmpty */ false));
>      \
> @@ -4198,22 +4198,26 @@ bool LLParser::ParseDIGlobalVariable(MDN
>    OPTIONAL(isLocal, MDBoolField, );
>       \
>    OPTIONAL(isDefinition, MDBoolField, (true));
>      \
>    OPTIONAL(expr, MDField, );
>      \
> -  OPTIONAL(declaration, MDField, );
> +  OPTIONAL(declaration, MDField, );
>       \
> +  OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));
>    PARSE_MD_FIELDS();
>  #undef VISIT_MD_FIELDS
>
>    Result = GET_OR_DISTINCT(DIGlobalVariable,
>                             (Context, scope.Val, name.Val, linkageName.Val,
>                              file.Val, line.Val, type.Val, isLocal.Val,
> -                            isDefinition.Val, expr.Val, declaration.Val));
> +                            isDefinition.Val, expr.Val, declaration.Val,
> +                            align.Val));
>    return false;
>  }
>
>  /// ParseDILocalVariable:
>  ///   ::= !DILocalVariable(arg: 7, scope: !0, name: "foo",
> -///                        file: !1, line: 7, type: !2, arg: 2, flags: 7)
> +///                        file: !1, line: 7, type: !2, arg: 2, flags: 7,
> +///                        align: 8)
>  ///   ::= !DILocalVariable(scope: !0, name: "foo",
> -///                        file: !1, line: 7, type: !2, arg: 2, flags: 7)
> +///                        file: !1, line: 7, type: !2, arg: 2, flags: 7,
> +///                        align: 8)
>  bool LLParser::ParseDILocalVariable(MDNode *&Result, bool IsDistinct) {
>  #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED)
>       \
>    REQUIRED(scope, MDField, (/* AllowNull */ false));
>      \
> @@ -4222,13 +4226,14 @@ bool LLParser::ParseDILocalVariable(MDNo
>    OPTIONAL(file, MDField, );
>      \
>    OPTIONAL(line, LineField, );
>      \
>    OPTIONAL(type, MDField, );
>      \
> -  OPTIONAL(flags, DIFlagField, );
> +  OPTIONAL(flags, DIFlagField, );
>       \
> +  OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));
>    PARSE_MD_FIELDS();
>  #undef VISIT_MD_FIELDS
>
>    Result = GET_OR_DISTINCT(DILocalVariable,
>                             (Context, scope.Val, name.Val, file.Val,
> line.Val,
> -                            type.Val, arg.Val, flags.Val));
> +                            type.Val, arg.Val, flags.Val, align.Val));
>    return false;
>  }
>
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Bitcode/Reader/BitcodeReader.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Wed Oct 19 19:13:12
> 2016
> @@ -2734,7 +2734,7 @@ std::error_code BitcodeReader::parseMeta
>        break;
>      }
>      case bitc::METADATA_GLOBAL_VAR: {
> -      if (Record.size() != 11)
> +      if (Record.size() < 11 || Record.size() > 12)
>          return error("Invalid record");
>
>        IsDistinct = Record[0];
> @@ -2742,6 +2742,7 @@ std::error_code BitcodeReader::parseMeta
>        // Upgrade old metadata, which stored a global variable reference
> or a
>        // ConstantInt here.
>        Metadata *Expr = getMDOrNull(Record[9]);
> +      uint64_t AlignInBits = (Record.size() > 11) ? Record[11] : 0;
>        GlobalVariable *Attach = nullptr;
>        if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
>          if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
> @@ -2761,7 +2762,7 @@ std::error_code BitcodeReader::parseMeta
>            (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
>             getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
>             getDITypeRefOrNull(Record[6]), Record[7], Record[8], Expr,
> -           getMDOrNull(Record[10])));
> +           getMDOrNull(Record[10]), AlignInBits));
>        MetadataList.assignValue(DGV, NextMetadataNo++);
>
>        if (Attach)
> @@ -2774,18 +2775,21 @@ std::error_code BitcodeReader::parseMeta
>        if (Record.size() < 8 || Record.size() > 10)
>          return error("Invalid record");
>
> +      IsDistinct = Record[0] & 1;
> +      bool HasAlignment = Record[0] & 2;
>        // 2nd field used to be an artificial tag, either
> DW_TAG_auto_variable or
> -      // DW_TAG_arg_variable.
> -      IsDistinct = Record[0];
> -      bool HasTag = Record.size() > 8;
> +      // DW_TAG_arg_variable, if we have alignment flag encoded it means,
> that
> +      // this is newer version of record which doesn't have artifical tag.
> +      bool HasTag = !HasAlignment && Record.size() > 8;
>        DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 +
> HasTag]);
> +      uint64_t AlignInBits = HasAlignment ? Record[8 + HasTag] : 0;
>        MetadataList.assignValue(
>            GET_OR_DISTINCT(DILocalVariable,
>                            (Context, getMDOrNull(Record[1 + HasTag]),
>                             getMDString(Record[2 + HasTag]),
>                             getMDOrNull(Record[3 + HasTag]), Record[4 +
> HasTag],
>                             getDITypeRefOrNull(Record[5 + HasTag]),
> -                           Record[6 + HasTag], Flags)),
> +                           Record[6 + HasTag], Flags, AlignInBits)),
>            NextMetadataNo++);
>        break;
>      }
>
> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Bitcode/Writer/BitcodeWriter.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Wed Oct 19 19:13:12
> 2016
> @@ -1712,6 +1712,7 @@ void ModuleBitcodeWriter::writeDIGlobalV
>    Record.push_back(N->isDefinition());
>    Record.push_back(VE.getMetadataOrNullID(N->getRawExpr()));
>    Record.push_back(VE.getMetadataOrNullID(N->
> getStaticDataMemberDeclaration()));
> +  Record.push_back(N->getAlignInBits());
>
>    Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev);
>    Record.clear();
> @@ -1720,7 +1721,21 @@ void ModuleBitcodeWriter::writeDIGlobalV
>  void ModuleBitcodeWriter::writeDILocalVariable(
>      const DILocalVariable *N, SmallVectorImpl<uint64_t> &Record,
>      unsigned Abbrev) {
> -  Record.push_back(N->isDistinct());
> +  // In order to support all possible bitcode formats in BitcodeReader we
> need
> +  // to distiguish the following cases:
> +  // 1) Record has no artificial tag (Record[1]),
> +  //   has no obsolete inlinedAt field (Record[9]).
> +  //   In this case Record size will be 8, HasAlignment flag is false.
> +  // 2) Record has artificial tag (Record[1]),
> +  //   has no obsolete inlignedAt field (Record[9]).
> +  //   In this case Record size will be 9, HasAlignment flag is false.
> +  // 3) Record has both artificial tag (Record[1]) and
> +  //   obsolete inlignedAt field (Record[9]).
> +  //   In this case Record size will be 10, HasAlignment flag is false.
> +  // 4) Record has neither artificial tag, nor inlignedAt field, but
> +  //   HasAlignment flag is true and Record[8] contains alignment value.
> +  const uint64_t HasAlignmentFlag = 1 << 1;
> +  Record.push_back(N->isDistinct() | HasAlignmentFlag);
>    Record.push_back(VE.getMetadataOrNullID(N->getScope()));
>    Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
>    Record.push_back(VE.getMetadataOrNullID(N->getFile()));
> @@ -1728,6 +1743,7 @@ void ModuleBitcodeWriter::writeDILocalVa
>    Record.push_back(VE.getMetadataOrNullID(N->getType()));
>    Record.push_back(N->getArg());
>    Record.push_back(N->getFlags());
> +  Record.push_back(N->getAlignInBits());
>
>    Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev);
>    Record.clear();
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> CodeGen/AsmPrinter/DwarfUnit.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed Oct 19 19:13:12
> 2016
> @@ -1404,9 +1404,11 @@ void DwarfUnit::constructMemberDIE(DIE &
>        addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
>
>        uint64_t Offset = DT->getOffsetInBits();
> -      uint32_t Align = DT->getAlignInBits() ? DT->getAlignInBits()
> -                                               : FieldSize;
> -      uint32_t AlignMask = ~(Align - 1);
> +      // We can't use DT->getAlignInBits() here: AlignInBits for member
> type
> +      // is non-zero if and only if alignment was forced (e.g.
> _Alignas()),
> +      // which can't be done with bitfields. Thus we use FieldSize here.
> +      uint32_t AlignInBits = FieldSize;
> +      uint32_t AlignMask = ~(AlignInBits - 1);
>        // The bits from the start of the storage unit to the start of the
> field.
>        uint64_t StartBitOffset = Offset - (Offset & AlignMask);
>        // The byte offset of the field's aligned storage unit inside the
> struct.
>
> Modified: llvm/trunk/lib/IR/AsmWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> AsmWriter.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/AsmWriter.cpp (original)
> +++ llvm/trunk/lib/IR/AsmWriter.cpp Wed Oct 19 19:13:12 2016
> @@ -1822,6 +1822,7 @@ static void writeDIGlobalVariable(raw_os
>    Printer.printBool("isDefinition", N->isDefinition());
>    Printer.printMetadata("expr", N->getExpr());
>    Printer.printMetadata("declaration", N->getRawStaticDataMemberDeclarat
> ion());
> +  Printer.printInt("align", N->getAlignInBits());
>    Out << ")";
>  }
>
> @@ -1837,6 +1838,7 @@ static void writeDILocalVariable(raw_ost
>    Printer.printInt("line", N->getLine());
>    Printer.printMetadata("type", N->getRawType());
>    Printer.printDIFlags("flags", N->getFlags());
> +  Printer.printInt("align", N->getAlignInBits());
>    Out << ")";
>  }
>
>
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> DIBuilder.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Wed Oct 19 19:13:12 2016
> @@ -195,11 +195,10 @@ DIBasicType *DIBuilder::createNullPtrTyp
>  }
>
>  DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t
> SizeInBits,
> -                                        uint32_t AlignInBits,
>                                          unsigned Encoding) {
>    assert(!Name.empty() && "Unable to create type without name");
>    return DIBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name,
> SizeInBits,
> -                          AlignInBits, Encoding);
> +                          0, Encoding);
>  }
>
>  DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType
> *FromTy) {
> @@ -277,24 +276,26 @@ static ConstantAsMetadata *getConstantOr
>
>  DIDerivedType *DIBuilder::createBitFieldMemberType(
>      DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
> -    uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
> -    uint64_t StorageOffsetInBits, DINode::DIFlags Flags, DIType *Ty) {
> +    uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t
> StorageOffsetInBits,
> +    DINode::DIFlags Flags, DIType *Ty) {
>    Flags |= DINode::FlagBitField;
>    return DIDerivedType::get(
>        VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
> -      getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits,
> OffsetInBits,
> -      Flags, ConstantAsMetadata::get(ConstantInt::get(
> -                 IntegerType::get(VMContext, 64), StorageOffsetInBits)));
> +      getNonCompileUnitScope(Scope), Ty, SizeInBits, /* AlignInBits */ 0,
> +      OffsetInBits, Flags,
> +      ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext,
> 64),
> +                                               StorageOffsetInBits)));
>  }
>
>  DIDerivedType *
>  DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name, DIFile
> *File,
>                                    unsigned LineNumber, DIType *Ty,
> -                                  DINode::DIFlags Flags, llvm::Constant
> *Val) {
> +                                  DINode::DIFlags Flags, llvm::Constant
> *Val,
> +                                  uint32_t AlignInBits) {
>    Flags |= DINode::FlagStaticMember;
>    return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
> -                            LineNumber, getNonCompileUnitScope(Scope),
> Ty, 0, 0,
> -                            0, Flags, getConstantOrNull(Val));
> +                            LineNumber, getNonCompileUnitScope(Scope),
> Ty, 0,
> +                            AlignInBits, 0, Flags,
> getConstantOrNull(Val));
>  }
>
>  DIDerivedType *
> @@ -535,28 +536,28 @@ static void checkGlobalVariableScope(DIS
>
>  DIGlobalVariable *DIBuilder::createGlobalVariable(
>      DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
> -    unsigned LineNumber, DIType *Ty, bool isLocalToUnit, DIExpression
> *Expr,
> -    MDNode *Decl) {
> +    unsigned LineNumber, DIType *Ty, bool isLocalToUnit,
> +    DIExpression *Expr, MDNode *Decl, uint32_t AlignInBits) {
>    checkGlobalVariableScope(Context);
>
>    auto *N = DIGlobalVariable::getDistinct(
>        VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
>        LineNumber, Ty, isLocalToUnit, true, Expr,
> -      cast_or_null<DIDerivedType>(Decl));
> +      cast_or_null<DIDerivedType>(Decl), AlignInBits);
>    AllGVs.push_back(N);
>    return N;
>  }
>
>  DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
>      DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
> -    unsigned LineNumber, DIType *Ty, bool isLocalToUnit, DIExpression
> *Expr,
> -    MDNode *Decl) {
> +    unsigned LineNumber, DIType *Ty, bool isLocalToUnit,
> +    DIExpression *Expr, MDNode *Decl, uint32_t AlignInBits) {
>    checkGlobalVariableScope(Context);
>
>    return DIGlobalVariable::getTemporary(
>               VMContext, cast_or_null<DIScope>(Context), Name,
> LinkageName, F,
>               LineNumber, Ty, isLocalToUnit, false, Expr,
> -             cast_or_null<DIDerivedType>(Decl))
> +             cast_or_null<DIDerivedType>(Decl), AlignInBits)
>        .release();
>  }
>
> @@ -564,7 +565,8 @@ static DILocalVariable *createLocalVaria
>      LLVMContext &VMContext,
>      DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>>
> &PreservedVariables,
>      DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
> -    unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags
> Flags) {
> +    unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags
> Flags,
> +    uint32_t AlignInBits) {
>    // FIXME: Why getNonCompileUnitScope()?
>    // FIXME: Why is "!Context" okay here?
>    // FIXME: Why doesn't this check for a subprogram or lexical block
> (AFAICT
> @@ -573,7 +575,7 @@ static DILocalVariable *createLocalVaria
>
>    auto *Node =
>        DILocalVariable::get(VMContext, cast_or_null<DILocalScope>(Context),
> Name,
> -                           File, LineNo, Ty, ArgNo, Flags);
> +                           File, LineNo, Ty, ArgNo, Flags, AlignInBits);
>    if (AlwaysPreserve) {
>      // The optimizer may remove local variables. If there is an interest
>      // to preserve variable info in such situation then stash it in a
> @@ -588,10 +590,11 @@ static DILocalVariable *createLocalVaria
>  DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef
> Name,
>                                                 DIFile *File, unsigned
> LineNo,
>                                                 DIType *Ty, bool
> AlwaysPreserve,
> -                                               DINode::DIFlags Flags) {
> +                                               DINode::DIFlags Flags,
> +                                               uint32_t AlignInBits) {
>    return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
>                               /* ArgNo */ 0, File, LineNo, Ty,
> AlwaysPreserve,
> -                             Flags);
> +                             Flags, AlignInBits);
>  }
>
>  DILocalVariable *DIBuilder::createParameterVariable(
> @@ -599,7 +602,8 @@ DILocalVariable *DIBuilder::createParame
>      unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags
> Flags) {
>    assert(ArgNo && "Expected non-zero argument number for parameter");
>    return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
> ArgNo,
> -                             File, LineNo, Ty, AlwaysPreserve, Flags);
> +                             File, LineNo, Ty, AlwaysPreserve, Flags,
> +                             /* AlignInBits */0);
>  }
>
>  DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
>
> Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> DebugInfoMetadata.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
> +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Wed Oct 19 19:13:12 2016
> @@ -510,16 +510,18 @@ DIGlobalVariable::getImpl(LLVMContext &C
>                            Metadata *Type, bool IsLocalToUnit, bool
> IsDefinition,
>                            Metadata *Variable,
>                            Metadata *StaticDataMemberDeclaration,
> +                          uint64_t AlignInBits,
>                            StorageType Storage, bool ShouldCreate) {
>    assert(isCanonical(Name) && "Expected canonical MDString");
>    assert(isCanonical(LinkageName) && "Expected canonical MDString");
>    DEFINE_GETIMPL_LOOKUP(DIGlobalVariable,
>                          (Scope, Name, LinkageName, File, Line, Type,
>                           IsLocalToUnit, IsDefinition, Variable,
> -                         StaticDataMemberDeclaration));
> +                         StaticDataMemberDeclaration, AlignInBits));
>    Metadata *Ops[] = {Scope, Name,        File,     Type,
>                       Name,  LinkageName, Variable,
> StaticDataMemberDeclaration};
> -  DEFINE_GETIMPL_STORE(DIGlobalVariable, (Line, IsLocalToUnit,
> IsDefinition),
> +  DEFINE_GETIMPL_STORE(DIGlobalVariable,
> +                       (Line, IsLocalToUnit, IsDefinition, AlignInBits),
>                         Ops);
>  }
>
> @@ -527,6 +529,7 @@ DILocalVariable *DILocalVariable::getImp
>                                            MDString *Name, Metadata *File,
>                                            unsigned Line, Metadata *Type,
>                                            unsigned Arg, DIFlags Flags,
> +                                          uint64_t AlignInBits,
>                                            StorageType Storage,
>                                            bool ShouldCreate) {
>    // 64K ought to be enough for any frontend.
> @@ -535,9 +538,10 @@ DILocalVariable *DILocalVariable::getImp
>    assert(Scope && "Expected scope");
>    assert(isCanonical(Name) && "Expected canonical MDString");
>    DEFINE_GETIMPL_LOOKUP(DILocalVariable,
> -                        (Scope, Name, File, Line, Type, Arg, Flags));
> +                        (Scope, Name, File, Line, Type, Arg, Flags,
> +                         AlignInBits));
>    Metadata *Ops[] = {Scope, Name, File, Type};
> -  DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags), Ops);
> +  DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags, AlignInBits),
> Ops);
>  }
>
>  DIExpression *DIExpression::getImpl(LLVMContext &Context,
>
> Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> LLVMContextImpl.h?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
> +++ llvm/trunk/lib/IR/LLVMContextImpl.h Wed Oct 19 19:13:12 2016
> @@ -761,22 +761,26 @@ template <> struct MDNodeKeyImpl<DIGloba
>    bool IsDefinition;
>    Metadata *Expr;
>    Metadata *StaticDataMemberDeclaration;
> +  uint64_t AlignInBits;
>
>    MDNodeKeyImpl(Metadata *Scope, MDString *Name, MDString *LinkageName,
>                  Metadata *File, unsigned Line, Metadata *Type,
> -                bool IsLocalToUnit, bool IsDefinition, Metadata *Expr,
> -                Metadata *StaticDataMemberDeclaration)
> +                bool IsLocalToUnit, bool IsDefinition,
> +                Metadata *Expr, Metadata *StaticDataMemberDeclaration,
> +                uint64_t AlignInBits)
>        : Scope(Scope), Name(Name), LinkageName(LinkageName), File(File),
>          Line(Line), Type(Type), IsLocalToUnit(IsLocalToUnit),
>          IsDefinition(IsDefinition), Expr(Expr),
> -        StaticDataMemberDeclaration(StaticDataMemberDeclaration) {}
> +        StaticDataMemberDeclaration(StaticDataMemberDeclaration),
> +        AlignInBits(AlignInBits) {}
>    MDNodeKeyImpl(const DIGlobalVariable *N)
>        : Scope(N->getRawScope()), Name(N->getRawName()),
>          LinkageName(N->getRawLinkageName()), File(N->getRawFile()),
>          Line(N->getLine()), Type(N->getRawType()),
>          IsLocalToUnit(N->isLocalToUnit()), IsDefinition(N->isDefinition()
> ),
>          Expr(N->getRawExpr()),
> -        StaticDataMemberDeclaration(N->getRawStaticDataMemberDeclaration())
> {}
> +        StaticDataMemberDeclaration(N->getRawStaticDataMemberDeclarat
> ion()),
> +        AlignInBits(N->getAlignInBits()) {}
>
>    bool isKeyOf(const DIGlobalVariable *RHS) const {
>      return Scope == RHS->getRawScope() && Name == RHS->getRawName() &&
> @@ -786,11 +790,19 @@ template <> struct MDNodeKeyImpl<DIGloba
>             IsDefinition == RHS->isDefinition() &&
>             Expr == RHS->getRawExpr() &&
>             StaticDataMemberDeclaration ==
> -               RHS->getRawStaticDataMemberDeclaration();
> +               RHS->getRawStaticDataMemberDeclaration() &&
> +           AlignInBits == RHS->getAlignInBits();
>    }
>    unsigned getHashValue() const {
> +    // We do not use AlignInBits in hashing function here on purpose:
> +    // in most cases this param for local variable is zero (for function
> param
> +    // it is always zero). This leads to lots of hash collisions and
> errors on
> +    // cases with lots of similar variables.
> +    // clang/test/CodeGen/debug-info-257-args.c is an example of this
> problem,
> +    // generated IR is random for each run and test fails with Align
> included.
> +    // TODO: make hashing work fine with such situations
>      return hash_combine(Scope, Name, LinkageName, File, Line, Type,
> -                        IsLocalToUnit, IsDefinition, Expr,
> +                        IsLocalToUnit, IsDefinition, /* AlignInBits, */
> Expr,
>                          StaticDataMemberDeclaration);
>    }
>  };
> @@ -803,23 +815,32 @@ template <> struct MDNodeKeyImpl<DILocal
>    Metadata *Type;
>    unsigned Arg;
>    unsigned Flags;
> +  uint64_t AlignInBits;
>
>    MDNodeKeyImpl(Metadata *Scope, MDString *Name, Metadata *File, unsigned
> Line,
> -                Metadata *Type, unsigned Arg, unsigned Flags)
> +                Metadata *Type, unsigned Arg, unsigned Flags,
> +                uint64_t AlignInBits)
>        : Scope(Scope), Name(Name), File(File), Line(Line), Type(Type),
> Arg(Arg),
> -        Flags(Flags) {}
> +        Flags(Flags), AlignInBits(AlignInBits) {}
>    MDNodeKeyImpl(const DILocalVariable *N)
>        : Scope(N->getRawScope()), Name(N->getRawName()),
> File(N->getRawFile()),
>          Line(N->getLine()), Type(N->getRawType()), Arg(N->getArg()),
> -        Flags(N->getFlags()) {}
> +        Flags(N->getFlags()), AlignInBits(N->getAlignInBits()) {}
>
>    bool isKeyOf(const DILocalVariable *RHS) const {
>      return Scope == RHS->getRawScope() && Name == RHS->getRawName() &&
>             File == RHS->getRawFile() && Line == RHS->getLine() &&
>             Type == RHS->getRawType() && Arg == RHS->getArg() &&
> -           Flags == RHS->getFlags();
> +           Flags == RHS->getFlags() && AlignInBits ==
> RHS->getAlignInBits();
>    }
>    unsigned getHashValue() const {
> +    // We do not use AlignInBits in hashing function here on purpose:
> +    // in most cases this param for local variable is zero (for function
> param
> +    // it is always zero). This leads to lots of hash collisions and
> errors on
> +    // cases with lots of similar variables.
> +    // clang/test/CodeGen/debug-info-257-args.c is an example of this
> problem,
> +    // generated IR is random for each run and test fails with Align
> included.
> +    // TODO: make hashing work fine with such situations
>      return hash_combine(Scope, Name, File, Line, Type, Arg, Flags);
>    }
>  };
>
> Modified: llvm/trunk/test/Assembler/diglobalvariable.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Assembler/diglobalvariable.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/Assembler/diglobalvariable.ll (original)
> +++ llvm/trunk/test/Assembler/diglobalvariable.ll Wed Oct 19 19:13:12 2016
> @@ -12,10 +12,10 @@
>  !3 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
>  !4 = distinct !{}
>
> -; CHECK: !5 = !DIGlobalVariable(name: "foo", linkageName: "foo", scope:
> !0, file: !2, line: 7, type: !3, isLocal: true, isDefinition: false)
> +; CHECK: !5 = !DIGlobalVariable(name: "foo", linkageName: "foo", scope:
> !0, file: !2, line: 7, type: !3, isLocal: true, isDefinition: false, align:
> 32)
>  !5 = !DIGlobalVariable(name: "foo", linkageName: "foo", scope: !0,
>                         file: !2, line: 7, type: !3, isLocal: true,
> -                       isDefinition: false)
> +                       isDefinition: false, align: 32)
>
>  ; CHECK: !6 = !DIGlobalVariable(name: "foo", scope: !0, isLocal: false,
> isDefinition: true, expr: !7)
>  ; CHECK: !7 = !DIExpression(DW_OP_constu, 42, DW_OP_stack_value)
>
> Modified: llvm/trunk/test/Assembler/dilocalvariable.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Assembler/dilocalvariable.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/Assembler/dilocalvariable.ll (original)
> +++ llvm/trunk/test/Assembler/dilocalvariable.ll Wed Oct 19 19:13:12 2016
> @@ -18,11 +18,11 @@
>  !3 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
>  !4 = !DILocation(scope: !0)
>
> -; CHECK: !5 = !DILocalVariable(name: "foo", arg: 3, scope: !0, file: !2,
> line: 7, type: !3, flags: DIFlagArtificial)
> +; CHECK: !5 = !DILocalVariable(name: "foo", arg: 3, scope: !0, file: !2,
> line: 7, type: !3, flags: DIFlagArtificial, align: 32)
>  ; CHECK: !6 = !DILocalVariable(name: "foo", scope: !0, file: !2, line: 7,
> type: !3, flags: DIFlagArtificial)
>  !5 = !DILocalVariable(name: "foo", arg: 3,
>                        scope: !0, file: !2, line: 7, type: !3,
> -                      flags: DIFlagArtificial)
> +                      flags: DIFlagArtificial, align: 32)
>  !6 = !DILocalVariable(name: "foo", scope: !0,
>                        file: !2, line: 7, type: !3, flags:
> DIFlagArtificial)
>
>
> Added: llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Bitcode/dilocalvariable-3.9.ll?rev=284678&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll (added)
> +++ llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll Wed Oct 19 19:13:12
> 2016
> @@ -0,0 +1,43 @@
> +; RUN: llvm-dis -o - %s.bc | FileCheck %s
> +
> +; CHECK: !9 = !DILocalVariable(name: "i", scope: !6, file: !1, line: 3,
> type: !10)
> +; CHECK: !10 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> +
> +source_filename = "test.cpp"
> +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 @_Z1fv() #0 !dbg !6 {
> +entry:
> +  %i = alloca i32, align 4
> +  call void @llvm.dbg.declare(metadata i32* %i, metadata !10, metadata
> !12), !dbg !13
> +  store i32 42, i32* %i, align 4, !dbg !13
> +  ret void, !dbg !14
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
> +
> +attributes #0 = { nounwind uwtable }
> +attributes #1 = { nounwind readnone }
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!3, !4}
> +!llvm.ident = !{!5}
> +
> +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1,
> producer: "clang version 3.9.1 (http://llvm.org/git/clang.git
> c3709e72d22432f53f8e2f14354def31a96734fe)", isOptimized: false,
> runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
> +!1 = !DIFile(filename: "test.cpp", directory: "/tmp")
> +!2 = !{}
> +!3 = !{i32 2, !"Dwarf Version", i32 4}
> +!4 = !{i32 2, !"Debug Info Version", i32 3}
> +!5 = !{!"clang version 3.9.1 (http://llvm.org/git/clang.git
> c3709e72d22432f53f8e2f14354def31a96734fe)"}
> +!6 = distinct !DISubprogram(name: "f", linkageName: "_Z1fv", scope: !7,
> file: !7, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine:
> 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
> +!7 = !DIFile(filename: "test.cpp", directory: "/tmp")
> +!8 = !DISubroutineType(types: !9)
> +!9 = !{null}
> +!10 = !DILocalVariable(name: "i", scope: !6, file: !7, line: 3, type: !11)
> +!11 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> +!12 = !DIExpression()
> +!13 = !DILocation(line: 3, column: 7, scope: !6)
> +!14 = !DILocation(line: 4, column: 1, scope: !6)
>
> Added: llvm/trunk/test/Bitcode/dilocalvariable-3.9.ll.bc
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Bitcode/dilocalvariable-3.9.ll.bc?rev=284678&view=auto
> ============================================================
> ==================
>     (empty)
>
> Modified: llvm/trunk/test/DebugInfo/AArch64/bitfields.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/AArch64/bitfields.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/AArch64/bitfields.ll (original)
> +++ llvm/trunk/test/DebugInfo/AArch64/bitfields.ll Wed Oct 19 19:13:12
> 2016
> @@ -60,13 +60,13 @@ target triple = "aarch64_be--linux-gnu"
>  !3 = !{!4}
>  !4 = !DIGlobalVariable(name: "b", scope: !0, file: !5, line: 8, type: !6,
> isLocal: false, isDefinition: true)
>  !5 = !DIFile(filename: "bitfields.c", directory: "/")
> -!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "bitfield", file:
> !5, line: 1, size: 96, align: 32, elements: !7)
> +!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "bitfield", file:
> !5, line: 1, size: 96, elements: !7)
>  !7 = !{!8, !10, !11, !12}
> -!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !5,
> line: 2, baseType: !9, size: 2, align: 32)
> -!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> -!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !5,
> line: 3, baseType: !9, size: 32, align: 32, offset: 32)
> -!11 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !6, file: !5,
> line: 4, baseType: !9, size: 1, align: 32, offset: 64)
> -!12 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !6, file: !5,
> line: 5, baseType: !9, size: 28, align: 32, offset: 65)
> +!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !5,
> line: 2, baseType: !9, size: 2)
> +!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !5,
> line: 3, baseType: !9, size: 32, offset: 32)
> +!11 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !6, file: !5,
> line: 4, baseType: !9, size: 1, offset: 64)
> +!12 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !6, file: !5,
> line: 5, baseType: !9, size: 28, offset: 65)
>  !13 = !{i32 2, !"Dwarf Version", i32 2}
>  !14 = !{i32 2, !"Debug Info Version", i32 3}
>  !15 = !{i32 1, !"PIC Level", i32 2}
>
> Modified: llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/ARM/big-endian-bitfield.ll?rev=284678&r1=
> 284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll (original)
> +++ llvm/trunk/test/DebugInfo/ARM/big-endian-bitfield.ll Wed Oct 19
> 19:13:12 2016
> @@ -23,29 +23,29 @@ target datalayout = "E-m:e-p:32:32-i64:6
>  !2 = !{}
>  !3 = !{!4}
>  !4 = distinct !DIGlobalVariable(name: "s", scope: !0, file: !1, line: 6,
> type: !5, isLocal: false, isDefinition: true)
> -!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S",
> file: !1, line: 1, size: 32, align: 32, elements: !6)
> +!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S",
> file: !1, line: 1, size: 32, elements: !6)
>  !6 = !{!7, !9, !10, !11}
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"j"
>  ; CHECK-NOT:  DW_TAG
>  ; CHECK:      DW_AT_data_bit_offset      [DW_FORM_data1]       (0x00)
> -!7 = !DIDerivedType(tag: DW_TAG_member, name: "j", scope: !5, file: !1,
> line: 2, baseType: !8, size: 5, align: 32)
> -!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> +!7 = !DIDerivedType(tag: DW_TAG_member, name: "j", scope: !5, file: !1,
> line: 2, baseType: !8, size: 5)
> +!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"k"
>  ; CHECK-NOT:  DW_TAG
>  ; CHECK:      DW_AT_data_bit_offset      [DW_FORM_data1]       (0x05)
> -!9 = !DIDerivedType(tag: DW_TAG_member, name: "k", scope: !5, file: !1,
> line: 3, baseType: !8, size: 6, align: 32, offset: 5)
> +!9 = !DIDerivedType(tag: DW_TAG_member, name: "k", scope: !5, file: !1,
> line: 3, baseType: !8, size: 6, offset: 5)
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"m"
>  ; CHECK-NOT:  DW_TAG
>  ; CHECK:      DW_AT_data_bit_offset      [DW_FORM_data1]       (0x0b)
> -!10 = !DIDerivedType(tag: DW_TAG_member, name: "m", scope: !5, file: !1,
> line: 4, baseType: !8, size: 5, align: 32, offset: 11)
> +!10 = !DIDerivedType(tag: DW_TAG_member, name: "m", scope: !5, file: !1,
> line: 4, baseType: !8, size: 5, offset: 11)
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"n"
>  ; CHECK-NOT:  DW_TAG
>  ; CHECK:      DW_AT_data_bit_offset      [DW_FORM_data1]       (0x10)
> -!11 = !DIDerivedType(tag: DW_TAG_member, name: "n", scope: !5, file: !1,
> line: 5, baseType: !8, size: 8, align: 32, offset: 16)
> +!11 = !DIDerivedType(tag: DW_TAG_member, name: "n", scope: !5, file: !1,
> line: 5, baseType: !8, size: 8, offset: 16)
>  !12 = !{i32 2, !"Dwarf Version", i32 4}
>  !13 = !{i32 2, !"Debug Info Version", i32 3}
>  !14 = !{i32 1, !"PIC Level", i32 2}
>
> Modified: llvm/trunk/test/DebugInfo/COFF/bitfields.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/COFF/bitfields.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/COFF/bitfields.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/bitfields.ll Wed Oct 19 19:13:12 2016
> @@ -195,33 +195,33 @@ target triple = "x86_64-pc-windows-msvc1
>  !3 = !{!4, !10, !29}
>  !4 = distinct !DIGlobalVariable(name: "s0", scope: !0, file: !5, line: 7,
> type: !6, isLocal: false, isDefinition: true)
>  !5 = !DIFile(filename: "<stdin>", directory: "/usr/local/google/home/
> majnemer/llvm/src")
> -!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S0",
> file: !5, line: 3, size: 24, align: 8, elements: !7)
> +!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S0",
> file: !5, line: 3, size: 24, elements: !7)
>  !7 = !{!8}
> -!8 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !6, file: !5,
> line: 6, baseType: !9, size: 8, align: 16, offset: 16, flags:
> DIFlagBitField, extraData: i64 8)
> -!9 = !DIBasicType(name: "short", size: 16, align: 16, encoding:
> DW_ATE_signed)
> +!8 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !6, file: !5,
> line: 6, baseType: !9, size: 8, offset: 16, flags: DIFlagBitField,
> extraData: i64 8)
> +!9 = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed)
>  !10 = distinct !DIGlobalVariable(name: "s1", scope: !0, file: !5, line:
> 18, type: !11, isLocal: false, isDefinition: true)
> -!11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S1",
> file: !5, line: 10, size: 128, align: 8, elements: !12)
> +!11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S1",
> file: !5, line: 10, size: 128, elements: !12)
>  !12 = !{!13, !18, !19, !21, !22, !23, !28}
> -!13 = !DIDerivedType(tag: DW_TAG_member, name: "x1", scope: !11, file:
> !5, line: 11, baseType: !14, size: 16, align: 8)
> -!14 = !DICompositeType(tag: DW_TAG_array_type, baseType: !15, size: 16,
> align: 8, elements: !16)
> -!15 = !DIBasicType(name: "char", size: 8, align: 8, encoding:
> DW_ATE_signed_char)
> +!13 = !DIDerivedType(tag: DW_TAG_member, name: "x1", scope: !11, file:
> !5, line: 11, baseType: !14, size: 16)
> +!14 = !DICompositeType(tag: DW_TAG_array_type, baseType: !15, size: 16,
> elements: !16)
> +!15 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
>  !16 = !{!17}
>  !17 = !DISubrange(count: 2)
> -!18 = !DIDerivedType(tag: DW_TAG_member, name: "x2", scope: !11, file:
> !5, line: 12, baseType: !15, size: 8, align: 8, offset: 16)
> -!19 = !DIDerivedType(tag: DW_TAG_member, name: "y", scope: !11, file: !5,
> line: 13, baseType: !20, size: 23, align: 32, offset: 24, flags:
> DIFlagBitField, extraData: i64 24)
> -!20 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> -!21 = !DIDerivedType(tag: DW_TAG_member, name: "z", scope: !11, file: !5,
> line: 14, baseType: !20, size: 23, align: 32, offset: 56, flags:
> DIFlagBitField, extraData: i64 56)
> -!22 = !DIDerivedType(tag: DW_TAG_member, name: "w", scope: !11, file: !5,
> line: 15, baseType: !20, size: 2, align: 32, offset: 79, flags:
> DIFlagBitField, extraData: i64 56)
> -!23 = !DIDerivedType(tag: DW_TAG_member, name: "v", scope: !11, file: !5,
> line: 16, baseType: !24, size: 24, align: 8, offset: 88)
> -!24 = distinct !DICompositeType(tag: DW_TAG_structure_type, scope: !11,
> file: !5, line: 16, size: 24, align: 8, elements: !25)
> +!18 = !DIDerivedType(tag: DW_TAG_member, name: "x2", scope: !11, file:
> !5, line: 12, baseType: !15, size: 8, offset: 16)
> +!19 = !DIDerivedType(tag: DW_TAG_member, name: "y", scope: !11, file: !5,
> line: 13, baseType: !20, size: 23, offset: 24, flags: DIFlagBitField,
> extraData: i64 24)
> +!20 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!21 = !DIDerivedType(tag: DW_TAG_member, name: "z", scope: !11, file: !5,
> line: 14, baseType: !20, size: 23, offset: 56, flags: DIFlagBitField,
> extraData: i64 56)
> +!22 = !DIDerivedType(tag: DW_TAG_member, name: "w", scope: !11, file: !5,
> line: 15, baseType: !20, size: 2, offset: 79, flags: DIFlagBitField,
> extraData: i64 56)
> +!23 = !DIDerivedType(tag: DW_TAG_member, name: "v", scope: !11, file: !5,
> line: 16, baseType: !24, size: 24, offset: 88)
> +!24 = distinct !DICompositeType(tag: DW_TAG_structure_type, scope: !11,
> file: !5, line: 16, size: 24, elements: !25)
>  !25 = !{!26, !27}
> -!26 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !24, file: !5,
> line: 16, baseType: !15, size: 8, align: 8)
> -!27 = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: !24, file: !5,
> line: 16, baseType: !9, size: 16, align: 16, offset: 8)
> -!28 = !DIDerivedType(tag: DW_TAG_member, name: "u", scope: !11, file: !5,
> line: 17, baseType: !9, size: 3, align: 16, offset: 112, flags:
> DIFlagBitField, extraData: i64 112)
> +!26 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !24, file: !5,
> line: 16, baseType: !15, size: 8)
> +!27 = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: !24, file: !5,
> line: 16, baseType: !9, size: 16, offset: 8)
> +!28 = !DIDerivedType(tag: DW_TAG_member, name: "u", scope: !11, file: !5,
> line: 17, baseType: !9, size: 3, offset: 112, flags: DIFlagBitField,
> extraData: i64 112)
>  !29 = distinct !DIGlobalVariable(name: "s2", scope: !0, file: !5, line:
> 24, type: !30, isLocal: false, isDefinition: true)
> -!30 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S2",
> file: !5, line: 21, size: 32, align: 8, elements: !31)
> +!30 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S2",
> file: !5, line: 21, size: 32, elements: !31)
>  !31 = !{!32}
> -!32 = !DIDerivedType(tag: DW_TAG_member, name: "y", scope: !30, file: !5,
> line: 23, baseType: !20, size: 1, align: 32, flags: DIFlagBitField,
> extraData: i64 0)
> +!32 = !DIDerivedType(tag: DW_TAG_member, name: "y", scope: !30, file: !5,
> line: 23, baseType: !20, size: 1, flags: DIFlagBitField, extraData: i64 0)
>  !33 = !{i32 2, !"CodeView", i32 1}
>  !34 = !{i32 2, !"Debug Info Version", i32 3}
>  !35 = !{i32 1, !"PIC Level", i32 2}
>
> Modified: llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/X86/bitfields-dwarf4.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/bitfields-dwarf4.ll Wed Oct 19 19:13:12
> 2016
> @@ -32,7 +32,7 @@ target triple = "x86_64-apple-macosx"
>  !2 = !{}
>  !3 = !{!4}
>  !4 = distinct !DIGlobalVariable(name: "s", scope: !0, file: !1, line: 8,
> type: !5, isLocal: false, isDefinition: true)
> -!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name:
> "PackedBits", file: !1, line: 3, size: 40, align: 8, elements: !6)
> +!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name:
> "PackedBits", file: !1, line: 3, size: 40, elements: !6)
>  !6 = !{!7, !9, !13}
>
>  ; CHECK: DW_TAG_member
> @@ -41,9 +41,9 @@ target triple = "x86_64-apple-macosx"
>  ; CHECK-NOT:  DW_AT_bit_offset
>  ; CHECK-NOT:  DW_AT_data_bit_offset
>  ; CHECK:      DW_AT_data_member_location [DW_FORM_data1]       (0x00)
> -!7 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !5, file: !1,
> line: 5, baseType: !8, size: 8, align: 8)
> +!7 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !5, file: !1,
> line: 5, baseType: !8, size: 8)
>
> -!8 = !DIBasicType(name: "char", size: 8, align: 8, encoding:
> DW_ATE_signed_char)
> +!8 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
>
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"b"
> @@ -54,11 +54,11 @@ target triple = "x86_64-apple-macosx"
>  ; CHECK-NOT:  DW_AT_byte_size
>  ; CHECK-NEXT: DW_AT_data_bit_offset      [DW_FORM_data1]       (0x08)
>  ; CHECK-NOT:  DW_AT_data_member_location
> -!9 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !5, file: !1,
> line: 6, baseType: !10, size: 5, align: 32, offset: 8)
> +!9 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !5, file: !1,
> line: 6, baseType: !10, size: 5, offset: 8)
>
>  !10 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint32_t", file: !11,
> line: 183, baseType: !12)
>  !11 = !DIFile(filename: "/Volumes/Data/llvm/_build.
> ninja.release/bin/../lib/clang/3.9.0/include/stdint.h", directory:
> "/Volumes/Data/llvm")
> -!12 = !DIBasicType(name: "unsigned int", size: 32, align: 32, encoding:
> DW_ATE_unsigned)
> +!12 = !DIBasicType(name: "unsigned int", size: 32, encoding:
> DW_ATE_unsigned)
>
>  ; CHECK: DW_TAG_member
>  ; CHECK-NEXT: DW_AT_name{{.*}}"c"
> @@ -69,7 +69,7 @@ target triple = "x86_64-apple-macosx"
>  ; CHECK-NEXT: DW_AT_data_bit_offset      [DW_FORM_data1]       (0x0d)
>  ; CHECK-NOT:  DW_AT_data_member_location
>  ; CHECK: DW_TAG
> -!13 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !5, file: !1,
> line: 7, baseType: !10, size: 27, align: 32, offset: 13)
> +!13 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !5, file: !1,
> line: 7, baseType: !10, size: 27, offset: 13)
>
>  !14 = !{i32 2, !"Dwarf Version", i32 4}
>  !15 = !{i32 2, !"Debug Info Version", i32 3}
>
> Modified: llvm/trunk/test/DebugInfo/X86/bitfields.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/X86/bitfields.ll?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/X86/bitfields.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/bitfields.ll Wed Oct 19 19:13:12 2016
> @@ -60,13 +60,13 @@ target triple = "x86_64-apple-macosx"
>  !3 = !{!4}
>  !4 = !DIGlobalVariable(name: "b", scope: !0, file: !5, line: 8, type: !6,
> isLocal: false, isDefinition: true)
>  !5 = !DIFile(filename: "bitfields.c", directory: "/")
> -!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "bitfield", file:
> !5, line: 1, size: 96, align: 32, elements: !7)
> +!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "bitfield", file:
> !5, line: 1, size: 96, elements: !7)
>  !7 = !{!8, !10, !11, !12}
> -!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !5,
> line: 2, baseType: !9, size: 2, align: 32)
> -!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> -!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !5,
> line: 3, baseType: !9, size: 32, align: 32, offset: 32)
> -!11 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !6, file: !5,
> line: 4, baseType: !9, size: 1, align: 32, offset: 64)
> -!12 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !6, file: !5,
> line: 5, baseType: !9, size: 28, align: 32, offset: 65)
> +!8 = !DIDerivedType(tag: DW_TAG_member, name: "a", scope: !6, file: !5,
> line: 2, baseType: !9, size: 2)
> +!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!10 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !6, file: !5,
> line: 3, baseType: !9, size: 32, offset: 32)
> +!11 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !6, file: !5,
> line: 4, baseType: !9, size: 1, offset: 64)
> +!12 = !DIDerivedType(tag: DW_TAG_member, name: "d", scope: !6, file: !5,
> line: 5, baseType: !9, size: 28, offset: 65)
>  !13 = !{i32 2, !"Dwarf Version", i32 2}
>  !14 = !{i32 2, !"Debug Info Version", i32 3}
>  !15 = !{i32 1, !"PIC Level", i32 2}
>
> Modified: llvm/trunk/test/DebugInfo/X86/debug-info-packed-struct.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/X86/debug-info-packed-struct.ll?rev=284678&
> r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/X86/debug-info-packed-struct.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/debug-info-packed-struct.ll Wed Oct 19
> 19:13:12 2016
> @@ -154,45 +154,45 @@ target triple = "x86_64-apple-darwin"
>  !3 = !{!4, !18, !25, !35}
>  !4 = !DIGlobalVariable(name: "l0", scope: !0, file: !5, line: 88, type:
> !6, isLocal: false, isDefinition: true)
>  !5 = !DIFile(filename: "/llvm/tools/clang/test/CodeGen/debug-info-packed-struct.c",
> directory: "/llvm/_build.ninja.release")
> -!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout0", file:
> !5, line: 15, size: 192, align: 64, elements: !7)
> +!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout0", file:
> !5, line: 15, size: 192, elements: !7)
>  !7 = !{!8, !10, !17}
> -!8 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs0", scope: !6, file:
> !5, line: 16, baseType: !9, size: 8, align: 8)
> -!9 = !DIBasicType(name: "char", size: 8, align: 8, encoding:
> DW_ATE_signed_char)
> -!10 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs8", scope: !6,
> file: !5, line: 17, baseType: !11, size: 64, align: 64, offset: 64)
> -!11 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8", file:
> !5, line: 11, size: 64, align: 64, elements: !12)
> +!8 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs0", scope: !6, file:
> !5, line: 16, baseType: !9, size: 8)
> +!9 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
> +!10 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs8", scope: !6,
> file: !5, line: 17, baseType: !11, size: 64, offset: 64)
> +!11 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8", file:
> !5, line: 11, size: 64, elements: !12)
>  !12 = !{!13, !15}
> -!13 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !11, file: !5,
> line: 12, baseType: !14, size: 4, align: 32)
> -!14 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> +!13 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !11, file: !5,
> line: 12, baseType: !14, size: 4)
> +!14 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
>  !15 = !DIDerivedType(tag: DW_TAG_member, name: "l", scope: !11, file: !5,
> line: 13, baseType: !16, size: 60, offset: 4)
> -!16 = !DIBasicType(name: "long long int", size: 64, align: 64, encoding:
> DW_ATE_signed)
> -!17 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs16", scope: !6,
> file: !5, line: 18, baseType: !14, size: 1, align: 32, offset: 128)
> +!16 = !DIBasicType(name: "long long int", size: 64, encoding:
> DW_ATE_signed)
> +!17 = !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs16", scope: !6,
> file: !5, line: 18, baseType: !14, size: 1, offset: 128)
>  !18 = !DIGlobalVariable(name: "l1", scope: !0, file: !5, line: 89, type:
> !19, isLocal: false, isDefinition: true)
> -!19 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout1", file:
> !5, line: 34, size: 96, align: 32, elements: !20)
> +!19 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout1", file:
> !5, line: 34, size: 96, elements: !20)
>  !20 = !{!21, !22, !24}
> -!21 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs0", scope: !19,
> file: !5, line: 35, baseType: !9, size: 8, align: 8)
> -!22 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs1", scope: !19,
> file: !5, line: 36, baseType: !23, size: 64, align: 8, offset: 8)
> -!23 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_anon",
> file: !5, line: 30, size: 64, align: 8, elements: !2)
> -!24 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs9", scope: !19,
> file: !5, line: 37, baseType: !14, size: 1, align: 32, offset: 72)
> +!21 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs0", scope: !19,
> file: !5, line: 35, baseType: !9, size: 8)
> +!22 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs1", scope: !19,
> file: !5, line: 36, baseType: !23, size: 64, offset: 8)
> +!23 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_anon",
> file: !5, line: 30, size: 64, elements: !2)
> +!24 = !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs9", scope: !19,
> file: !5, line: 37, baseType: !14, size: 1, offset: 72)
>  !25 = !DIGlobalVariable(name: "l2", scope: !0, file: !5, line: 90, type:
> !26, isLocal: false, isDefinition: true)
> -!26 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout2", file:
> !5, line: 54, size: 80, align: 8, elements: !27)
> +!26 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout2", file:
> !5, line: 54, size: 80, elements: !27)
>  !27 = !{!28, !29, !34}
> -!28 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs0", scope: !26,
> file: !5, line: 55, baseType: !9, size: 8, align: 8)
> -!29 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1", scope: !26,
> file: !5, line: 56, baseType: !30, size: 64, align: 8, offset: 8)
> -!30 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_pack1",
> file: !5, line: 50, size: 64, align: 8, elements: !31)
> +!28 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs0", scope: !26,
> file: !5, line: 55, baseType: !9, size: 8)
> +!29 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1", scope: !26,
> file: !5, line: 56, baseType: !30, size: 64, offset: 8)
> +!30 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_pack1",
> file: !5, line: 50, size: 64, elements: !31)
>  !31 = !{!32, !33}
> -!32 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !30, file: !5,
> line: 51, baseType: !14, size: 4, align: 32)
> +!32 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !30, file: !5,
> line: 51, baseType: !14, size: 4)
>  !33 = !DIDerivedType(tag: DW_TAG_member, name: "l", scope: !30, file: !5,
> line: 52, baseType: !16, size: 60, offset: 4)
> -!34 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9", scope: !26,
> file: !5, line: 57, baseType: !14, size: 1, align: 32, offset: 72)
> +!34 = !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9", scope: !26,
> file: !5, line: 57, baseType: !14, size: 1, offset: 72)
>  !35 = !DIGlobalVariable(name: "l3", scope: !0, file: !5, line: 91, type:
> !36, isLocal: false, isDefinition: true)
> -!36 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout3", file:
> !5, line: 76, size: 128, align: 32, elements: !37)
> +!36 = !DICompositeType(tag: DW_TAG_structure_type, name: "layout3", file:
> !5, line: 76, size: 128, elements: !37)
>  !37 = !{!38, !39, !44}
> -!38 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs0", scope: !36,
> file: !5, line: 77, baseType: !9, size: 8, align: 8)
> -!39 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4", scope: !36,
> file: !5, line: 78, baseType: !40, size: 64, align: 32, offset: 32)
> -!40 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_pack4",
> file: !5, line: 72, size: 64, align: 32, elements: !41)
> +!38 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs0", scope: !36,
> file: !5, line: 77, baseType: !9, size: 8)
> +!39 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4", scope: !36,
> file: !5, line: 78, baseType: !40, size: 64, offset: 32)
> +!40 = !DICompositeType(tag: DW_TAG_structure_type, name: "size8_pack4",
> file: !5, line: 72, size: 64, elements: !41)
>  !41 = !{!42, !43}
> -!42 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !40, file: !5,
> line: 73, baseType: !14, size: 4, align: 32)
> +!42 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !40, file: !5,
> line: 73, baseType: !14, size: 4)
>  !43 = !DIDerivedType(tag: DW_TAG_member, name: "l", scope: !40, file: !5,
> line: 74, baseType: !16, size: 60, offset: 4)
> -!44 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12", scope: !36,
> file: !5, line: 79, baseType: !14, size: 1, align: 32, offset: 96)
> +!44 = !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12", scope: !36,
> file: !5, line: 79, baseType: !14, size: 1, offset: 96)
>  !45 = !{i32 2, !"Dwarf Version", i32 2}
>  !46 = !{i32 2, !"Debug Info Version", i32 3}
>  !47 = !{!"clang version 3.7.0 (trunk 240791) (llvm/trunk 240790)"}
>
> Modified: llvm/trunk/unittests/IR/MetadataTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/
> IR/MetadataTest.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/unittests/IR/MetadataTest.cpp (original)
> +++ llvm/trunk/unittests/IR/MetadataTest.cpp Wed Oct 19 19:13:12 2016
> @@ -1824,10 +1824,12 @@ TEST_F(DIGlobalVariableTest, get) {
>    auto *Expr2 = DIExpression::get(Context, {1, 2, 3});
>    DIDerivedType *StaticDataMemberDeclaration =
>        cast<DIDerivedType>(getDerivedType());
> +  uint64_t AlignInBits = 8;
>
>    auto *N = DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File, Line,
>                                    Type, IsLocalToUnit, IsDefinition,
> -                                  Expr, StaticDataMemberDeclaration);
> +                                  Expr, StaticDataMemberDeclaration,
> +                                  AlignInBits);
>    EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag());
>    EXPECT_EQ(Scope, N->getScope());
>    EXPECT_EQ(Name, N->getName());
> @@ -1839,45 +1841,61 @@ TEST_F(DIGlobalVariableTest, get) {
>    EXPECT_EQ(IsDefinition, N->isDefinition());
>    EXPECT_EQ(Expr, N->getExpr());
>    EXPECT_EQ(StaticDataMemberDeclaration, N->
> getStaticDataMemberDeclaration());
> +  EXPECT_EQ(AlignInBits, N->getAlignInBits());
>    EXPECT_EQ(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File,
>                                       Line, Type, IsLocalToUnit,
> IsDefinition,
> -                                     Expr, StaticDataMemberDeclaration));
> +                                     Expr, StaticDataMemberDeclaration,
> +                                     AlignInBits));
>
>    EXPECT_NE(N,
>              DIGlobalVariable::get(Context, getSubprogram(), Name,
> LinkageName,
>                                    File, Line, Type, IsLocalToUnit,
> IsDefinition,
> -                                  Expr, StaticDataMemberDeclaration));
> +                                  Expr, StaticDataMemberDeclaration,
> +                                  AlignInBits));
>    EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, "other",
> LinkageName, File,
>                                       Line, Type, IsLocalToUnit,
> IsDefinition,
> -                                     Expr, StaticDataMemberDeclaration));
> +                                     Expr, StaticDataMemberDeclaration,
> +                                     AlignInBits));
>    EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, "other", File,
> Line,
>                                       Type, IsLocalToUnit, IsDefinition,
> Expr,
> -                                     StaticDataMemberDeclaration));
> +                                     StaticDataMemberDeclaration,
> +                                     AlignInBits));
>    EXPECT_NE(N,
>              DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> getFile(),
>                                    Line, Type, IsLocalToUnit,
> IsDefinition, Expr,
> -                                  StaticDataMemberDeclaration));
> +                                  StaticDataMemberDeclaration,
> +                                  AlignInBits));
>    EXPECT_NE(N,
>              DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
>                                    Line + 1, Type, IsLocalToUnit,
> IsDefinition,
> -                                  Expr, StaticDataMemberDeclaration));
> +                                  Expr, StaticDataMemberDeclaration,
> +                                  AlignInBits));
>    EXPECT_NE(N,
>              DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File, Line,
>                                    getDerivedType(), IsLocalToUnit,
> IsDefinition,
> -                                  Expr, StaticDataMemberDeclaration));
> +                                  Expr, StaticDataMemberDeclaration,
> +                                  AlignInBits));
>    EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File,
>                                       Line, Type, !IsLocalToUnit,
> IsDefinition,
> -                                     Expr, StaticDataMemberDeclaration));
> +                                     Expr, StaticDataMemberDeclaration,
> +                                     AlignInBits));
>    EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File,
>                                       Line, Type, IsLocalToUnit,
> !IsDefinition,
> -                                     Expr, StaticDataMemberDeclaration));
> +                                     Expr, StaticDataMemberDeclaration,
> +                                     AlignInBits));
>    EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File,
>                                       Line, Type, IsLocalToUnit,
> IsDefinition,
> -                                     Expr2, StaticDataMemberDeclaration));
> +                                     Expr2, StaticDataMemberDeclaration,
> +                                     AlignInBits));
>    EXPECT_NE(N,
>              DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File, Line,
>                                    Type, IsLocalToUnit, IsDefinition, Expr,
> -                                  cast<DIDerivedType>(
> getDerivedType())));
> +                                  cast<DIDerivedType>(getDerivedType()),
> +                                  AlignInBits));
> +  EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
> File,
> +                                     Line, Type, IsLocalToUnit,
> IsDefinition,
> +                                     Expr, StaticDataMemberDeclaration,
> +                                     (AlignInBits << 1)));
>
>    TempDIGlobalVariable Temp = N->clone();
>    EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
> @@ -1893,9 +1911,11 @@ TEST_F(DILocalVariableTest, get) {
>    DIType *Type = getDerivedType();
>    unsigned Arg = 6;
>    DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7);
> +  uint64_t AlignInBits = 8;
>
>    auto *N =
> -      DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
> Flags);
> +      DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
> Flags,
> +                           AlignInBits);
>    EXPECT_TRUE(N->isParameter());
>    EXPECT_EQ(Scope, N->getScope());
>    EXPECT_EQ(Name, N->getName());
> @@ -1904,24 +1924,27 @@ TEST_F(DILocalVariableTest, get) {
>    EXPECT_EQ(Type, N->getType());
>    EXPECT_EQ(Arg, N->getArg());
>    EXPECT_EQ(Flags, N->getFlags());
> +  EXPECT_EQ(AlignInBits, N->getAlignInBits());
>    EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line,
> Type, Arg,
> -                                    Flags));
> +                                    Flags, AlignInBits));
>
>    EXPECT_FALSE(
> -      DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0,
> Flags)
> -          ->isParameter());
> +      DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0,
> Flags,
> +                           AlignInBits)->isParameter());
>    EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File,
> Line,
> -                                    Type, Arg, Flags));
> +                                    Type, Arg, Flags, AlignInBits));
>    EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line,
> Type,
> -                                    Arg, Flags));
> +                                    Arg, Flags, AlignInBits));
>    EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(),
> Line, Type,
> -                                    Arg, Flags));
> +                                    Arg, Flags, AlignInBits));
>    EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1,
> Type,
> -                                    Arg, Flags));
> +                                    Arg, Flags, AlignInBits));
>    EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
> -                                    getDerivedType(), Arg, Flags));
> +                                    getDerivedType(), Arg, Flags,
> AlignInBits));
> +  EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
> Type,
> +                                    Arg + 1, Flags, AlignInBits));
>    EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
> Type,
> -                                    Arg + 1, Flags));
> +                                    Arg, Flags, (AlignInBits << 1)));
>
>    TempDILocalVariable Temp = N->clone();
>    EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
> @@ -1929,17 +1952,17 @@ TEST_F(DILocalVariableTest, get) {
>
>  TEST_F(DILocalVariableTest, getArg256) {
>    EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "",
> getFile(),
> -                                       0, nullptr, 255, DINode::FlagZero)
> +                                       0, nullptr, 255, DINode::FlagZero,
> 0)
>                        ->getArg());
>    EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "",
> getFile(),
> -                                       0, nullptr, 256, DINode::FlagZero)
> +                                       0, nullptr, 256, DINode::FlagZero,
> 0)
>                        ->getArg());
>    EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "",
> getFile(),
> -                                       0, nullptr, 257, DINode::FlagZero)
> +                                       0, nullptr, 257, DINode::FlagZero,
> 0)
>                        ->getArg());
>    unsigned Max = UINT16_MAX;
>    EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "",
> getFile(),
> -                                      0, nullptr, Max, DINode::FlagZero)
> +                                      0, nullptr, Max, DINode::FlagZero,
> 0)
>                       ->getArg());
>  }
>
>
> Modified: llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/
> Transforms/Utils/Cloning.cpp?rev=284678&r1=284677&r2=284678&view=diff
> ============================================================
> ==================
> --- llvm/trunk/unittests/Transforms/Utils/Cloning.cpp (original)
> +++ llvm/trunk/unittests/Transforms/Utils/Cloning.cpp Wed Oct 19 19:13:12
> 2016
> @@ -253,8 +253,7 @@ protected:
>      Instruction* Terminator = IBuilder.CreateRetVoid();
>
>      // Create a local variable around the alloca
> -    auto *IntType =
> -        DBuilder.createBasicType("int", 32, 0, dwarf::DW_ATE_signed);
> +    auto *IntType = DBuilder.createBasicType("int", 32,
> dwarf::DW_ATE_signed);
>      auto *E = DBuilder.createExpression();
>      auto *Variable =
>          DBuilder.createAutoVariable(Subprogram, "x", File, 5, IntType,
> true);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
-- 
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161020/23aaf895/attachment.html>


More information about the llvm-commits mailing list