[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