mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Debug Info: Add a file: field to DIImportedEntity.
DIImportedEntity has a line number, but not a file field. To determine the decl_line/decl_file we combine the line number from the DIImportedEntity with the file from the DIImportedEntity's scope. This does not work correctly when the parent scope is a DINamespace or a DIModule, both of which do not have a source file. This patch adds a file field to DIImportedEntity to unambiguously identify the source location of the using/import declaration. Most testcase updates are mechanical, the interesting one is the removal of the FIXME in test/DebugInfo/Generic/namespace.ll. This fixes PR33822. See https://bugs.llvm.org/show_bug.cgi?id=33822 for more context. <rdar://problem/33357889> https://bugs.llvm.org/show_bug.cgi?id=33822 Differential Revision: https://reviews.llvm.org/D35583 llvm-svn: 308398
This commit is contained in:
parent
d5560f679f
commit
d9729b268c
@ -674,32 +674,37 @@ namespace llvm {
|
||||
|
||||
/// Create a descriptor for an imported module.
|
||||
/// \param Context The scope this module is imported into
|
||||
/// \param NS The namespace being imported here
|
||||
/// \param Line Line number
|
||||
/// \param NS The namespace being imported here.
|
||||
/// \param File File where the declaration is located.
|
||||
/// \param Line Line number of the declaration.
|
||||
DIImportedEntity *createImportedModule(DIScope *Context, DINamespace *NS,
|
||||
unsigned Line);
|
||||
DIFile *File, unsigned Line);
|
||||
|
||||
/// Create a descriptor for an imported module.
|
||||
/// \param Context The scope this module is imported into
|
||||
/// \param NS An aliased namespace
|
||||
/// \param Line Line number
|
||||
/// \param Context The scope this module is imported into.
|
||||
/// \param NS An aliased namespace.
|
||||
/// \param File File where the declaration is located.
|
||||
/// \param Line Line number of the declaration.
|
||||
DIImportedEntity *createImportedModule(DIScope *Context,
|
||||
DIImportedEntity *NS, unsigned Line);
|
||||
DIImportedEntity *NS, DIFile *File,
|
||||
unsigned Line);
|
||||
|
||||
/// Create a descriptor for an imported module.
|
||||
/// \param Context The scope this module is imported into
|
||||
/// \param M The module being imported here
|
||||
/// \param Line Line number
|
||||
/// \param Context The scope this module is imported into.
|
||||
/// \param M The module being imported here
|
||||
/// \param File File where the declaration is located.
|
||||
/// \param Line Line number of the declaration.
|
||||
DIImportedEntity *createImportedModule(DIScope *Context, DIModule *M,
|
||||
unsigned Line);
|
||||
DIFile *File, unsigned Line);
|
||||
|
||||
/// Create a descriptor for an imported function.
|
||||
/// \param Context The scope this module is imported into
|
||||
/// \param Decl The declaration (or definition) of a function, type, or
|
||||
/// variable
|
||||
/// \param Line Line number
|
||||
/// \param Context The scope this module is imported into.
|
||||
/// \param Decl The declaration (or definition) of a function, type, or
|
||||
/// variable.
|
||||
/// \param File File where the declaration is located.
|
||||
/// \param Line Line number of the declaration.
|
||||
DIImportedEntity *createImportedDeclaration(DIScope *Context, DINode *Decl,
|
||||
unsigned Line,
|
||||
DIFile *File, unsigned Line,
|
||||
StringRef Name = "");
|
||||
|
||||
/// Insert a new llvm.dbg.declare intrinsic call.
|
||||
|
@ -2551,32 +2551,32 @@ class DIImportedEntity : public DINode {
|
||||
|
||||
static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
|
||||
DIScope *Scope, DINodeRef Entity,
|
||||
unsigned Line, StringRef Name,
|
||||
DIFile *File, unsigned Line, StringRef Name,
|
||||
StorageType Storage,
|
||||
bool ShouldCreate = true) {
|
||||
return getImpl(Context, Tag, Scope, Entity, Line,
|
||||
return getImpl(Context, Tag, Scope, Entity, File, Line,
|
||||
getCanonicalMDString(Context, Name), Storage, ShouldCreate);
|
||||
}
|
||||
static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
|
||||
Metadata *Scope, Metadata *Entity,
|
||||
unsigned Line, MDString *Name,
|
||||
StorageType Storage,
|
||||
Metadata *File, unsigned Line,
|
||||
MDString *Name, StorageType Storage,
|
||||
bool ShouldCreate = true);
|
||||
|
||||
TempDIImportedEntity cloneImpl() const {
|
||||
return getTemporary(getContext(), getTag(), getScope(), getEntity(),
|
||||
getLine(), getName());
|
||||
getFile(), getLine(), getName());
|
||||
}
|
||||
|
||||
public:
|
||||
DEFINE_MDNODE_GET(DIImportedEntity,
|
||||
(unsigned Tag, DIScope *Scope, DINodeRef Entity,
|
||||
unsigned Line, StringRef Name = ""),
|
||||
(Tag, Scope, Entity, Line, Name))
|
||||
DIFile *File, unsigned Line, StringRef Name = ""),
|
||||
(Tag, Scope, Entity, File, Line, Name))
|
||||
DEFINE_MDNODE_GET(DIImportedEntity,
|
||||
(unsigned Tag, Metadata *Scope, Metadata *Entity,
|
||||
unsigned Line, MDString *Name),
|
||||
(Tag, Scope, Entity, Line, Name))
|
||||
Metadata *File, unsigned Line, MDString *Name),
|
||||
(Tag, Scope, Entity, File, Line, Name))
|
||||
|
||||
TempDIImportedEntity clone() const { return cloneImpl(); }
|
||||
|
||||
@ -2584,10 +2584,12 @@ public:
|
||||
DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
|
||||
DINodeRef getEntity() const { return DINodeRef(getRawEntity()); }
|
||||
StringRef getName() const { return getStringOperand(2); }
|
||||
DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
|
||||
|
||||
Metadata *getRawScope() const { return getOperand(0); }
|
||||
Metadata *getRawEntity() const { return getOperand(1); }
|
||||
MDString *getRawName() const { return getOperandAs<MDString>(2); }
|
||||
Metadata *getRawFile() const { return getOperand(3); }
|
||||
|
||||
static bool classof(const Metadata *MD) {
|
||||
return MD->getMetadataID() == DIImportedEntityKind;
|
||||
|
@ -4411,13 +4411,15 @@ bool LLParser::ParseDIImportedEntity(MDNode *&Result, bool IsDistinct) {
|
||||
REQUIRED(tag, DwarfTagField, ); \
|
||||
REQUIRED(scope, MDField, ); \
|
||||
OPTIONAL(entity, MDField, ); \
|
||||
OPTIONAL(file, MDField, ); \
|
||||
OPTIONAL(line, LineField, ); \
|
||||
OPTIONAL(name, MDStringField, );
|
||||
PARSE_MD_FIELDS();
|
||||
#undef VISIT_MD_FIELDS
|
||||
|
||||
Result = GET_OR_DISTINCT(DIImportedEntity, (Context, tag.Val, scope.Val,
|
||||
entity.Val, line.Val, name.Val));
|
||||
Result = GET_OR_DISTINCT(
|
||||
DIImportedEntity,
|
||||
(Context, tag.Val, scope.Val, entity.Val, file.Val, line.Val, name.Val));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1671,15 +1671,17 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
|
||||
break;
|
||||
}
|
||||
case bitc::METADATA_IMPORTED_ENTITY: {
|
||||
if (Record.size() != 6)
|
||||
if (Record.size() != 6 && Record.size() != 7)
|
||||
return error("Invalid record");
|
||||
|
||||
IsDistinct = Record[0];
|
||||
bool HasFile = (Record.size() == 7);
|
||||
MetadataList.assignValue(
|
||||
GET_OR_DISTINCT(DIImportedEntity,
|
||||
(Context, Record[1], getMDOrNull(Record[2]),
|
||||
getDITypeRefOrNull(Record[3]), Record[4],
|
||||
getMDString(Record[5]))),
|
||||
getDITypeRefOrNull(Record[3]),
|
||||
HasFile ? getMDOrNull(Record[6]) : nullptr,
|
||||
HasFile ? Record[4] : 0, getMDString(Record[5]))),
|
||||
NextMetadataNo);
|
||||
NextMetadataNo++;
|
||||
break;
|
||||
|
@ -1718,6 +1718,7 @@ void ModuleBitcodeWriter::writeDIImportedEntity(
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getEntity()));
|
||||
Record.push_back(N->getLine());
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getRawFile()));
|
||||
|
||||
Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev);
|
||||
Record.clear();
|
||||
|
@ -664,8 +664,9 @@ DIE *DwarfCompileUnit::constructImportedEntityDIE(
|
||||
else
|
||||
EntityDie = getDIE(Entity);
|
||||
assert(EntityDie);
|
||||
addSourceLine(*IMDie, Module->getLine(), Module->getScope()->getFilename(),
|
||||
Module->getScope()->getDirectory());
|
||||
auto *File = Module->getFile();
|
||||
addSourceLine(*IMDie, Module->getLine(), File ? File->getFilename() : "",
|
||||
File ? File->getDirectory() : "");
|
||||
addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
|
||||
StringRef Name = Module->getName();
|
||||
if (!Name.empty())
|
||||
|
@ -1964,6 +1964,7 @@ static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N,
|
||||
Printer.printString("name", N->getName());
|
||||
Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);
|
||||
Printer.printMetadata("entity", N->getRawEntity());
|
||||
Printer.printMetadata("file", N->getRawFile());
|
||||
Printer.printInt("line", N->getLine());
|
||||
Out << ")";
|
||||
}
|
||||
|
@ -148,10 +148,13 @@ DICompileUnit *DIBuilder::createCompileUnit(
|
||||
|
||||
static DIImportedEntity *
|
||||
createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
|
||||
Metadata *NS, unsigned Line, StringRef Name,
|
||||
Metadata *NS, DIFile *File, unsigned Line, StringRef Name,
|
||||
SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
|
||||
if (Line)
|
||||
assert(File && "Source location has line number but no file");
|
||||
unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size();
|
||||
auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), Line, Name);
|
||||
auto *M =
|
||||
DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), File, Line, Name);
|
||||
if (EntitiesCount < C.pImpl->DIImportedEntitys.size())
|
||||
// A new Imported Entity was just added to the context.
|
||||
// Add it to the Imported Modules list.
|
||||
@ -160,33 +163,38 @@ createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
|
||||
}
|
||||
|
||||
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
|
||||
DINamespace *NS,
|
||||
DINamespace *NS, DIFile *File,
|
||||
unsigned Line) {
|
||||
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
|
||||
Context, NS, Line, StringRef(), AllImportedModules);
|
||||
Context, NS, File, Line, StringRef(),
|
||||
AllImportedModules);
|
||||
}
|
||||
|
||||
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
|
||||
DIImportedEntity *NS,
|
||||
unsigned Line) {
|
||||
DIFile *File, unsigned Line) {
|
||||
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
|
||||
Context, NS, Line, StringRef(), AllImportedModules);
|
||||
Context, NS, File, Line, StringRef(),
|
||||
AllImportedModules);
|
||||
}
|
||||
|
||||
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M,
|
||||
unsigned Line) {
|
||||
DIFile *File, unsigned Line) {
|
||||
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
|
||||
Context, M, Line, StringRef(), AllImportedModules);
|
||||
Context, M, File, Line, StringRef(),
|
||||
AllImportedModules);
|
||||
}
|
||||
|
||||
DIImportedEntity *DIBuilder::createImportedDeclaration(DIScope *Context,
|
||||
DINode *Decl,
|
||||
DIFile *File,
|
||||
unsigned Line,
|
||||
StringRef Name) {
|
||||
// Make sure to use the unique identifier based metadata reference for
|
||||
// types that have one.
|
||||
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
|
||||
Context, Decl, Line, Name, AllImportedModules);
|
||||
Context, Decl, File, Line, Name,
|
||||
AllImportedModules);
|
||||
}
|
||||
|
||||
DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory,
|
||||
|
@ -760,12 +760,13 @@ DIObjCProperty *DIObjCProperty::getImpl(
|
||||
|
||||
DIImportedEntity *DIImportedEntity::getImpl(LLVMContext &Context, unsigned Tag,
|
||||
Metadata *Scope, Metadata *Entity,
|
||||
unsigned Line, MDString *Name,
|
||||
StorageType Storage,
|
||||
Metadata *File, unsigned Line,
|
||||
MDString *Name, StorageType Storage,
|
||||
bool ShouldCreate) {
|
||||
assert(isCanonical(Name) && "Expected canonical MDString");
|
||||
DEFINE_GETIMPL_LOOKUP(DIImportedEntity, (Tag, Scope, Entity, Line, Name));
|
||||
Metadata *Ops[] = {Scope, Entity, Name};
|
||||
DEFINE_GETIMPL_LOOKUP(DIImportedEntity,
|
||||
(Tag, Scope, Entity, File, Line, Name));
|
||||
Metadata *Ops[] = {Scope, Entity, Name, File};
|
||||
DEFINE_GETIMPL_STORE(DIImportedEntity, (Tag, Line), Ops);
|
||||
}
|
||||
|
||||
|
@ -990,24 +990,26 @@ template <> struct MDNodeKeyImpl<DIImportedEntity> {
|
||||
unsigned Tag;
|
||||
Metadata *Scope;
|
||||
Metadata *Entity;
|
||||
Metadata *File;
|
||||
unsigned Line;
|
||||
MDString *Name;
|
||||
|
||||
MDNodeKeyImpl(unsigned Tag, Metadata *Scope, Metadata *Entity, unsigned Line,
|
||||
MDString *Name)
|
||||
: Tag(Tag), Scope(Scope), Entity(Entity), Line(Line), Name(Name) {}
|
||||
MDNodeKeyImpl(unsigned Tag, Metadata *Scope, Metadata *Entity, Metadata *File,
|
||||
unsigned Line, MDString *Name)
|
||||
: Tag(Tag), Scope(Scope), Entity(Entity), File(File), Line(Line),
|
||||
Name(Name) {}
|
||||
MDNodeKeyImpl(const DIImportedEntity *N)
|
||||
: Tag(N->getTag()), Scope(N->getRawScope()), Entity(N->getRawEntity()),
|
||||
Line(N->getLine()), Name(N->getRawName()) {}
|
||||
File(N->getRawFile()), Line(N->getLine()), Name(N->getRawName()) {}
|
||||
|
||||
bool isKeyOf(const DIImportedEntity *RHS) const {
|
||||
return Tag == RHS->getTag() && Scope == RHS->getRawScope() &&
|
||||
Entity == RHS->getRawEntity() && Line == RHS->getLine() &&
|
||||
Name == RHS->getRawName();
|
||||
Entity == RHS->getRawEntity() && File == RHS->getFile() &&
|
||||
Line == RHS->getLine() && Name == RHS->getRawName();
|
||||
}
|
||||
|
||||
unsigned getHashValue() const {
|
||||
return hash_combine(Tag, Scope, Entity, Line, Name);
|
||||
return hash_combine(Tag, Scope, Entity, File, Line, Name);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -18,9 +18,9 @@
|
||||
; CHECK: !3 = !DICompositeType({{.*}})
|
||||
!3 = !DICompositeType(tag: DW_TAG_structure_type, name: "Class", size: 32, align: 32)
|
||||
|
||||
; CHECK-NEXT: !4 = !DIImportedEntity(tag: DW_TAG_imported_module, name: "foo", scope: !0, entity: !1, line: 7)
|
||||
; CHECK-NEXT: !4 = !DIImportedEntity(tag: DW_TAG_imported_module, name: "foo", scope: !0, entity: !1, file: !2, line: 7)
|
||||
!4 = !DIImportedEntity(tag: DW_TAG_imported_module, name: "foo", scope: !0,
|
||||
entity: !1, line: 7)
|
||||
entity: !1, file: !2, line: 7)
|
||||
|
||||
; CHECK-NEXT: !5 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0)
|
||||
!5 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0)
|
||||
|
@ -36,4 +36,4 @@
|
||||
!9 = !{!"clang version 4.0.0 (trunk 286129) (llvm/trunk 286128)"}
|
||||
!10 = distinct !DIGlobalVariable(name: "c", scope: !1, file: !2, line: 1, type: !5, isLocal: false, isDefinition: true, expr: !DIExpression(DW_OP_constu, 23, DW_OP_stack_value))
|
||||
!11 = distinct !DIGlobalVariable(name: "h", scope: !1, file: !2, line: 2, type: !5, isLocal: false, isDefinition: true)
|
||||
!12 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 1, scope: !1, entity: !11)
|
||||
!12 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !2, line: 1, scope: !1, entity: !11)
|
||||
|
15
test/Bitcode/upgrade-importedentity.ll
Normal file
15
test/Bitcode/upgrade-importedentity.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llvm-dis < %s.bc | FileCheck %s
|
||||
; RUN: verify-uselistorder < %s.bc
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!9, !10}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 308185) (llvm/trunk 308186)", emissionKind: FullDebug, imports: !3)
|
||||
!1 = !DIFile(filename: "using.ii", directory: "/")
|
||||
!3 = !{!4}
|
||||
!4 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !5, entity: !8, line: 301)
|
||||
; CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !4, entity: !5)
|
||||
!5 = !DINamespace(name: "M", scope: null)
|
||||
!8 = !DINamespace(name: "N", scope: null)
|
||||
!9 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!10 = !{i32 2, !"Debug Info Version", i32 3}
|
BIN
test/Bitcode/upgrade-importedentity.ll.bc
Normal file
BIN
test/Bitcode/upgrade-importedentity.ll.bc
Normal file
Binary file not shown.
@ -54,17 +54,14 @@
|
||||
|
||||
; CHECK-NOT: NULL
|
||||
; CHECK: DW_TAG_imported_module
|
||||
; This is a bug, it should be in F2 but it inherits the file from its
|
||||
; enclosing scope
|
||||
; CHECK-NEXT: DW_AT_decl_file{{.*}}stdin
|
||||
; CHECK-NEXT: DW_AT_decl_file{{.*}}([[F2:.*]])
|
||||
; CHECK-NEXT: DW_AT_decl_line{{.*}}(15)
|
||||
; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS2]]})
|
||||
; CHECK: NULL
|
||||
; CHECK-NOT: NULL
|
||||
|
||||
; CHECK: DW_TAG_imported_module
|
||||
; Same bug as above, this should be F2
|
||||
; CHECK-NEXT: DW_AT_decl_file{{.*}}debug-info-namespace.cpp
|
||||
; CHECK-NEXT: DW_AT_decl_file{{.*}}([[F2:.*]])
|
||||
; CHECK-NEXT: DW_AT_decl_line{{.*}}(18)
|
||||
; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]})
|
||||
; CHECK-NOT: NULL
|
||||
@ -320,29 +317,29 @@ attributes #1 = { nounwind readnone }
|
||||
!31 = !DIGlobalVariable(name: "i", linkageName: "_ZN1A1B1iE", line: 20, isLocal: false, isDefinition: true, scope: !6, file: !18, type: !13)
|
||||
!32 = !DIGlobalVariable(name: "var_fwd", linkageName: "_ZN1A1B7var_fwdE", line: 44, isLocal: false, isDefinition: true, scope: !6, file: !18, type: !13)
|
||||
!33 = !{!34, !35, !36, !37, !40, !41, !42, !43, !44, !45, !47, !48, !49, !51, !54, !55, !56}
|
||||
!34 = !DIImportedEntity(tag: DW_TAG_imported_module, line: 15, scope: !7, entity: !6)
|
||||
!35 = !DIImportedEntity(tag: DW_TAG_imported_module, line: 18, scope: !0, entity: !7)
|
||||
!36 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 19, name: "E", scope: !0, entity: !7)
|
||||
!37 = !DIImportedEntity(tag: DW_TAG_imported_module, line: 23, scope: !38, entity: !6)
|
||||
!34 = !DIImportedEntity(tag: DW_TAG_imported_module, file: !5, line: 15, scope: !7, entity: !6)
|
||||
!35 = !DIImportedEntity(tag: DW_TAG_imported_module, file: !5, line: 18, scope: !0, entity: !7)
|
||||
!36 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 19, name: "E", scope: !0, entity: !7)
|
||||
!37 = !DIImportedEntity(tag: DW_TAG_imported_module, file: !5, line: 23, scope: !38, entity: !6)
|
||||
!38 = distinct !DILexicalBlock(line: 22, column: 10, file: !5, scope: !39)
|
||||
!39 = distinct !DILexicalBlock(line: 22, column: 7, file: !5, scope: !21)
|
||||
!40 = !DIImportedEntity(tag: DW_TAG_imported_module, line: 26, scope: !21, entity: !7)
|
||||
!41 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 27, scope: !21, entity: !4)
|
||||
!42 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 28, scope: !21, entity: !8)
|
||||
!43 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 29, scope: !21, entity: !14)
|
||||
!44 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 30, scope: !21, entity: !31)
|
||||
!45 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 31, scope: !21, entity: !46)
|
||||
!40 = !DIImportedEntity(tag: DW_TAG_imported_module, file: !5, line: 26, scope: !21, entity: !7)
|
||||
!41 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 27, scope: !21, entity: !4)
|
||||
!42 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 28, scope: !21, entity: !8)
|
||||
!43 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 29, scope: !21, entity: !14)
|
||||
!44 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 30, scope: !21, entity: !31)
|
||||
!45 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 31, scope: !21, entity: !46)
|
||||
!46 = !DIDerivedType(tag: DW_TAG_typedef, name: "baz", line: 7, file: !5, scope: !6, baseType: !8)
|
||||
!47 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 32, name: "X", scope: !21, entity: !7)
|
||||
!48 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 33, name: "Y", scope: !21, entity: !47)
|
||||
!49 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 34, scope: !21, entity: !50)
|
||||
!47 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 32, name: "X", scope: !21, entity: !7)
|
||||
!48 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 33, name: "Y", scope: !21, entity: !47)
|
||||
!49 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 34, scope: !21, entity: !50)
|
||||
!50 = !DIGlobalVariable(name: "var_decl", linkageName: "_ZN1A1B8var_declE", line: 8, isLocal: false, isDefinition: false, scope: !6, file: !18, type: !13)
|
||||
!51 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 35, scope: !21, entity: !52)
|
||||
!51 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 35, scope: !21, entity: !52)
|
||||
!52 = !DISubprogram(name: "func_decl", linkageName: "_ZN1A1B9func_declEv", line: 9, isLocal: false, isDefinition: false, flags: DIFlagPrototyped, isOptimized: false, file: !5, scope: !6, type: !19, variables: !53)
|
||||
!53 = !{} ; previously: invalid DW_TAG_base_type
|
||||
!54 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 36, scope: !21, entity: !32)
|
||||
!55 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 37, scope: !21, entity: !26)
|
||||
!56 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 42, scope: !7, entity: !31)
|
||||
!54 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 36, scope: !21, entity: !32)
|
||||
!55 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 37, scope: !21, entity: !26)
|
||||
!56 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !5, line: 42, scope: !7, entity: !31)
|
||||
!57 = !{i32 2, !"Dwarf Version", i32 2}
|
||||
!58 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!59 = !{!"clang version 3.6.0 "}
|
||||
|
@ -18,7 +18,7 @@ target triple = "x86_64-apple-macosx"
|
||||
!1 = !DIFile(filename: "/llvm/tools/clang/test/Modules/<stdin>", directory: "/")
|
||||
!2 = !{}
|
||||
!3 = !{!4}
|
||||
!4 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !0, entity: !5, line: 5)
|
||||
!4 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !0, entity: !5, file: !1, line: 5)
|
||||
!5 = !DIModule(scope: null, name: "DebugModule", configMacros: "-DMODULES=0", includePath: "/llvm/tools/clang/test/Modules/Inputs", isysroot: "/")
|
||||
!6 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!7 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
|
@ -24,7 +24,7 @@ target triple = "x86_64-apple-macosx"
|
||||
!4 = !{}
|
||||
!5 = !{!0}
|
||||
!6 = !{!7}
|
||||
!7 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !2, entity: !8, line: 11)
|
||||
!7 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !2, entity: !8, file: !3, line: 11)
|
||||
!8 = !DIModule(scope: null, name: "Module", includePath: ".", isysroot: "/")
|
||||
!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, align: 64)
|
||||
!10 = !DICompositeType(tag: DW_TAG_structure_type, name: "s", scope: !8, file: !3, line: 1, flags: DIFlagFwdDecl)
|
||||
|
@ -110,7 +110,7 @@ attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "n
|
||||
!16 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
||||
!17 = !DISubprogram(name: "f2<int>", linkageName: "_ZN3foo2f2IiEEvv", line: 10, isLocal: false, isDefinition: false, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 10, file: !1, scope: !4, type: !12, templateParams: !14)
|
||||
!18 = !{!19}
|
||||
!19 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 19, scope: !20, entity: !4)
|
||||
!19 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 19, scope: !20, entity: !4)
|
||||
!20 = distinct !DILexicalBlock(line: 16, column: 13, file: !1, scope: !21)
|
||||
!21 = distinct !DILexicalBlock(line: 16, column: 7, file: !1, scope: !10)
|
||||
!22 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
|
@ -345,9 +345,9 @@ attributes #1 = { nounwind readnone }
|
||||
!42 = !DINamespace(scope: !43)
|
||||
!43 = !DINamespace(name: "outer", scope: null)
|
||||
!44 = !{!45, !47}
|
||||
!45 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !2, entity: !46, line: 34)
|
||||
!45 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !2, entity: !46, file:!3, line: 34)
|
||||
!46 = !DIGlobalVariable(name: "global_namespace_variable_decl", linkageName: "_ZN2ns30global_namespace_variable_declE", scope: !18, file: !3, line: 28, type: !9, isLocal: false, isDefinition: false)
|
||||
!47 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !43, entity: !42, line: 43)
|
||||
!47 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !43, entity: !42, file: !3, line: 43)
|
||||
!48 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!49 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!50 = !{!"clang version 3.7.0 (trunk 234897) (llvm/trunk 234911)"}
|
||||
|
@ -134,7 +134,7 @@ attributes #2 = { nounwind }
|
||||
!8 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !9, file: !9, line: 6, type: !5, isLocal: false, isDefinition: true, scopeLine: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||
!9 = !DIFile(filename: "test.h", directory: "/")
|
||||
!10 = !{!11}
|
||||
!11 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !14, line: 1)
|
||||
!11 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !14, file: !1, line: 1)
|
||||
!12 = !DILexicalBlockFile(scope: !13, file: !9, discriminator: 0)
|
||||
!13 = distinct !DILexicalBlock(scope: !4, file: !1, line: 3)
|
||||
!14 = !DINamespace(name: "N", scope: null)
|
||||
|
@ -105,26 +105,26 @@ attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "n
|
||||
!19 = !DIDerivedType(tag: DW_TAG_typedef, name: "string", line: 65, file: !20, scope: !10, baseType: !8)
|
||||
!20 = !DIFile(filename: "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stringfwd.h", directory: "/llvm_cmake_gcc")
|
||||
!21 = !{!22, !26, !29, !33, !38, !41}
|
||||
!22 = !DIImportedEntity(tag: DW_TAG_imported_module, line: 57, scope: !23, entity: !25)
|
||||
!22 = !DIImportedEntity(tag: DW_TAG_imported_module, file: !1, line: 57, scope: !23, entity: !25)
|
||||
!23 = !DINamespace(name: "__gnu_debug", scope: null)
|
||||
!24 = !DIFile(filename: "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/debug/debug.h", directory: "/llvm_cmake_gcc")
|
||||
!25 = !DINamespace(name: "__debug", scope: !10)
|
||||
!26 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 66, scope: !10, entity: !27)
|
||||
!26 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 66, scope: !10, entity: !27)
|
||||
!27 = !DIDerivedType(tag: DW_TAG_typedef, name: "mbstate_t", line: 106, file: !5, baseType: !28)
|
||||
!28 = !DIDerivedType(tag: DW_TAG_typedef, name: "__mbstate_t", line: 95, file: !5, baseType: !4)
|
||||
!29 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 141, scope: !10, entity: !30)
|
||||
!29 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 141, scope: !10, entity: !30)
|
||||
!30 = !DIDerivedType(tag: DW_TAG_typedef, name: "wint_t", line: 141, file: !31, baseType: !32)
|
||||
!31 = !DIFile(filename: "/llvm_cmake_gcc/bin/../lib/clang/3.5.0/include/stddef.h", directory: "/llvm_cmake_gcc")
|
||||
!32 = !DIBasicType(tag: DW_TAG_base_type, name: "unsigned int", size: 32, align: 32, encoding: DW_ATE_unsigned)
|
||||
!33 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 42, scope: !34, entity: !36)
|
||||
!33 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 42, scope: !34, entity: !36)
|
||||
!34 = !DINamespace(name: "__gnu_cxx", scope: null)
|
||||
!35 = !DIFile(filename: "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/cpp_type_traits.h", directory: "/llvm_cmake_gcc")
|
||||
!36 = !DIDerivedType(tag: DW_TAG_typedef, name: "size_t", line: 155, file: !11, scope: !10, baseType: !37)
|
||||
!37 = !DIBasicType(tag: DW_TAG_base_type, name: "long unsigned int", size: 64, align: 64, encoding: DW_ATE_unsigned)
|
||||
!38 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 43, scope: !34, entity: !39)
|
||||
!38 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 43, scope: !34, entity: !39)
|
||||
!39 = !DIDerivedType(tag: DW_TAG_typedef, name: "ptrdiff_t", line: 156, file: !11, scope: !10, baseType: !40)
|
||||
!40 = !DIBasicType(tag: DW_TAG_base_type, name: "long int", size: 64, align: 64, encoding: DW_ATE_signed)
|
||||
!41 = !DIImportedEntity(tag: DW_TAG_imported_declaration, line: 55, scope: !10, entity: !6)
|
||||
!41 = !DIImportedEntity(tag: DW_TAG_imported_declaration, file: !1, line: 55, scope: !10, entity: !6)
|
||||
!42 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!43 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!44 = !{!"clang version 3.5.0 (209308)"}
|
||||
|
@ -44,13 +44,13 @@ entry:
|
||||
!7 = !{null}
|
||||
!8 = distinct !DISubprogram(name: "b", linkageName: "_ZN1A1bEv", scope: !5, file: !1, line: 8, type: !6, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||
!9 = !{!10, !16}
|
||||
!10 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !8, entity: !4, line: 8)
|
||||
!10 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !8, entity: !4, file: !1, line: 8)
|
||||
!11 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!12 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!13 = !{!"clang version 3.8.0 (trunk 256934) (llvm/trunk 256936)"}
|
||||
!14 = !DILocation(line: 7, column: 12, scope: !4)
|
||||
!15 = !DILocation(line: 8, column: 24, scope: !8)
|
||||
!16 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !17, entity: !19, line: 8)
|
||||
!16 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !17, entity: !19, file: !1, line: 8)
|
||||
!17 = distinct !DILexicalBlock(scope: !18, file: !1, line: 9, column: 8)
|
||||
!18 = distinct !DISubprogram(name: "c", linkageName: "_ZN1A1cEv", scope: !5, file: !1, line: 9, type: !6, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||
!19 = distinct !DILexicalBlock(scope: !20, file: !1, line: 10, column: 8)
|
||||
|
@ -51,11 +51,11 @@ entry:
|
||||
!9 = !DIGlobalVariableExpression(var: !10)
|
||||
!10 = !DIGlobalVariable(name: "version", scope: !4, file: !1, line: 2, type: !7, isLocal: false, isDefinition: true)
|
||||
!11 = !{!12, !16}
|
||||
!12 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !4, entity: !13, line: 8)
|
||||
!12 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !4, entity: !13, file: !1, line: 8)
|
||||
!13 = distinct !DISubprogram(name: "a", linkageName: "_ZN1A1aEv", scope: !4, file: !1, line: 7, type: !14, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !5)
|
||||
!14 = !DISubroutineType(types: !15)
|
||||
!15 = !{null}
|
||||
!16 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !17, entity: !19, line: 8)
|
||||
!16 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !17, entity: !19, file: !1, line: 8)
|
||||
!17 = distinct !DILexicalBlock(scope: !18, file: !1, line: 9, column: 8)
|
||||
!18 = distinct !DISubprogram(name: "c", linkageName: "_ZN1A1cEv", scope: !4, file: !1, line: 9, type: !14, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !5)
|
||||
!19 = distinct !DILexicalBlock(scope: !20, file: !1, line: 10, column: 8)
|
||||
|
@ -463,13 +463,14 @@ TEST_F(IRBuilderTest, DebugLoc) {
|
||||
TEST_F(IRBuilderTest, DIImportedEntity) {
|
||||
IRBuilder<> Builder(BB);
|
||||
DIBuilder DIB(*M);
|
||||
auto F = DIB.createFile("F.CBL", "/");
|
||||
auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74,
|
||||
DIB.createFile("F.CBL", "/"), "llvm-cobol74",
|
||||
F, "llvm-cobol74",
|
||||
true, "", 0);
|
||||
DIB.createImportedDeclaration(CU, nullptr, 1);
|
||||
DIB.createImportedDeclaration(CU, nullptr, 1);
|
||||
DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, 2);
|
||||
DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, 2);
|
||||
DIB.createImportedDeclaration(CU, nullptr, F, 1);
|
||||
DIB.createImportedDeclaration(CU, nullptr, F, 1);
|
||||
DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2);
|
||||
DIB.createImportedModule(CU, (DIImportedEntity *)nullptr, F, 2);
|
||||
DIB.finalize();
|
||||
EXPECT_TRUE(verifyModule(*M));
|
||||
EXPECT_TRUE(CU->getImportedEntities().size() == 2);
|
||||
|
@ -2116,29 +2116,35 @@ TEST_F(DIImportedEntityTest, get) {
|
||||
unsigned Tag = dwarf::DW_TAG_imported_module;
|
||||
DIScope *Scope = getSubprogram();
|
||||
DINode *Entity = getCompositeType();
|
||||
DIFile *File = getFile();
|
||||
unsigned Line = 5;
|
||||
StringRef Name = "name";
|
||||
|
||||
auto *N = DIImportedEntity::get(Context, Tag, Scope, Entity, Line, Name);
|
||||
auto *N =
|
||||
DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name);
|
||||
|
||||
EXPECT_EQ(Tag, N->getTag());
|
||||
EXPECT_EQ(Scope, N->getScope());
|
||||
EXPECT_EQ(Entity, N->getEntity());
|
||||
EXPECT_EQ(File, N->getFile());
|
||||
EXPECT_EQ(Line, N->getLine());
|
||||
EXPECT_EQ(Name, N->getName());
|
||||
EXPECT_EQ(N, DIImportedEntity::get(Context, Tag, Scope, Entity, Line, Name));
|
||||
EXPECT_EQ(
|
||||
N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name));
|
||||
|
||||
EXPECT_NE(N,
|
||||
DIImportedEntity::get(Context, dwarf::DW_TAG_imported_declaration,
|
||||
Scope, Entity, Line, Name));
|
||||
Scope, Entity, File, Line, Name));
|
||||
EXPECT_NE(N, DIImportedEntity::get(Context, Tag, getSubprogram(), Entity,
|
||||
Line, Name));
|
||||
File, Line, Name));
|
||||
EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, getCompositeType(),
|
||||
Line, Name));
|
||||
EXPECT_NE(N,
|
||||
DIImportedEntity::get(Context, Tag, Scope, Entity, Line + 1, Name));
|
||||
EXPECT_NE(N,
|
||||
DIImportedEntity::get(Context, Tag, Scope, Entity, Line, "other"));
|
||||
File, Line, Name));
|
||||
EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, nullptr, Line,
|
||||
Name));
|
||||
EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File,
|
||||
Line + 1, Name));
|
||||
EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line,
|
||||
"other"));
|
||||
|
||||
TempDIImportedEntity Temp = N->clone();
|
||||
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
|
||||
|
Loading…
Reference in New Issue
Block a user