mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
DebugInfo: Add flag to CU to disable emission of inline debug info into the skeleton CU
In cases where .dwo/.dwp files are guaranteed to be available, skipping the extra online (in the .o file) inline info can save a substantial amount of space - see the original r221306 for more details there. llvm-svn: 279650
This commit is contained in:
parent
e16dab59f1
commit
22b8e86371
@ -101,7 +101,7 @@ namespace llvm {
|
|||||||
unsigned RV, StringRef SplitName = StringRef(),
|
unsigned RV, StringRef SplitName = StringRef(),
|
||||||
DICompileUnit::DebugEmissionKind Kind =
|
DICompileUnit::DebugEmissionKind Kind =
|
||||||
DICompileUnit::DebugEmissionKind::FullDebug,
|
DICompileUnit::DebugEmissionKind::FullDebug,
|
||||||
uint64_t DWOId = 0);
|
uint64_t DWOId = 0, bool SplitDebugInlining = true);
|
||||||
|
|
||||||
/// Create a file descriptor to hold debugging information
|
/// Create a file descriptor to hold debugging information
|
||||||
/// for a file.
|
/// for a file.
|
||||||
|
@ -997,14 +997,16 @@ private:
|
|||||||
unsigned RuntimeVersion;
|
unsigned RuntimeVersion;
|
||||||
unsigned EmissionKind;
|
unsigned EmissionKind;
|
||||||
uint64_t DWOId;
|
uint64_t DWOId;
|
||||||
|
bool SplitDebugInlining;
|
||||||
|
|
||||||
DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage,
|
DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage,
|
||||||
bool IsOptimized, unsigned RuntimeVersion,
|
bool IsOptimized, unsigned RuntimeVersion,
|
||||||
unsigned EmissionKind, uint64_t DWOId, ArrayRef<Metadata *> Ops)
|
unsigned EmissionKind, uint64_t DWOId, bool SplitDebugInlining,
|
||||||
|
ArrayRef<Metadata *> Ops)
|
||||||
: DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
|
: DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
|
||||||
SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
|
SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
|
||||||
RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind),
|
RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind),
|
||||||
DWOId(DWOId) {
|
DWOId(DWOId), SplitDebugInlining(SplitDebugInlining) {
|
||||||
assert(Storage != Uniqued);
|
assert(Storage != Uniqued);
|
||||||
}
|
}
|
||||||
~DICompileUnit() = default;
|
~DICompileUnit() = default;
|
||||||
@ -1016,13 +1018,15 @@ private:
|
|||||||
unsigned EmissionKind, DICompositeTypeArray EnumTypes,
|
unsigned EmissionKind, DICompositeTypeArray EnumTypes,
|
||||||
DIScopeArray RetainedTypes, DIGlobalVariableArray GlobalVariables,
|
DIScopeArray RetainedTypes, DIGlobalVariableArray GlobalVariables,
|
||||||
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
|
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
|
||||||
uint64_t DWOId, StorageType Storage, bool ShouldCreate = true) {
|
uint64_t DWOId, bool SplitDebugInlining, StorageType Storage,
|
||||||
return getImpl(
|
bool ShouldCreate = true) {
|
||||||
Context, SourceLanguage, File, getCanonicalMDString(Context, Producer),
|
return getImpl(Context, SourceLanguage, File,
|
||||||
IsOptimized, getCanonicalMDString(Context, Flags), RuntimeVersion,
|
getCanonicalMDString(Context, Producer), IsOptimized,
|
||||||
getCanonicalMDString(Context, SplitDebugFilename), EmissionKind,
|
getCanonicalMDString(Context, Flags), RuntimeVersion,
|
||||||
EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(),
|
getCanonicalMDString(Context, SplitDebugFilename),
|
||||||
ImportedEntities.get(), Macros.get(), DWOId, Storage, ShouldCreate);
|
EmissionKind, EnumTypes.get(), RetainedTypes.get(),
|
||||||
|
GlobalVariables.get(), ImportedEntities.get(), Macros.get(),
|
||||||
|
DWOId, SplitDebugInlining, Storage, ShouldCreate);
|
||||||
}
|
}
|
||||||
static DICompileUnit *
|
static DICompileUnit *
|
||||||
getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
|
getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
|
||||||
@ -1030,15 +1034,16 @@ private:
|
|||||||
unsigned RuntimeVersion, MDString *SplitDebugFilename,
|
unsigned RuntimeVersion, MDString *SplitDebugFilename,
|
||||||
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
|
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
|
||||||
Metadata *GlobalVariables, Metadata *ImportedEntities,
|
Metadata *GlobalVariables, Metadata *ImportedEntities,
|
||||||
Metadata *Macros, uint64_t DWOId, StorageType Storage,
|
Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining,
|
||||||
bool ShouldCreate = true);
|
StorageType Storage, bool ShouldCreate = true);
|
||||||
|
|
||||||
TempDICompileUnit cloneImpl() const {
|
TempDICompileUnit cloneImpl() const {
|
||||||
return getTemporary(
|
return getTemporary(getContext(), getSourceLanguage(), getFile(),
|
||||||
getContext(), getSourceLanguage(), getFile(), getProducer(),
|
getProducer(), isOptimized(), getFlags(),
|
||||||
isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(),
|
getRuntimeVersion(), getSplitDebugFilename(),
|
||||||
getEmissionKind(), getEnumTypes(), getRetainedTypes(),
|
getEmissionKind(), getEnumTypes(), getRetainedTypes(),
|
||||||
getGlobalVariables(), getImportedEntities(), getMacros(), DWOId);
|
getGlobalVariables(), getImportedEntities(),
|
||||||
|
getMacros(), DWOId, getSplitDebugInlining());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get() = delete;
|
static void get() = delete;
|
||||||
@ -1053,20 +1058,21 @@ public:
|
|||||||
DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
|
DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
|
||||||
DIGlobalVariableArray GlobalVariables,
|
DIGlobalVariableArray GlobalVariables,
|
||||||
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
|
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
|
||||||
uint64_t DWOId),
|
uint64_t DWOId, bool SplitDebugInlining),
|
||||||
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
|
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
|
||||||
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
|
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
|
||||||
GlobalVariables, ImportedEntities, Macros, DWOId))
|
GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
|
||||||
DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
|
DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
|
||||||
DICompileUnit,
|
DICompileUnit,
|
||||||
(unsigned SourceLanguage, Metadata *File, MDString *Producer,
|
(unsigned SourceLanguage, Metadata *File, MDString *Producer,
|
||||||
bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
|
bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
|
||||||
MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes,
|
MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes,
|
||||||
Metadata *RetainedTypes, Metadata *GlobalVariables,
|
Metadata *RetainedTypes, Metadata *GlobalVariables,
|
||||||
Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId),
|
Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId,
|
||||||
|
bool SplitDebugInlining),
|
||||||
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
|
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
|
||||||
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
|
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
|
||||||
GlobalVariables, ImportedEntities, Macros, DWOId))
|
GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
|
||||||
|
|
||||||
TempDICompileUnit clone() const { return cloneImpl(); }
|
TempDICompileUnit clone() const { return cloneImpl(); }
|
||||||
|
|
||||||
@ -1096,6 +1102,10 @@ public:
|
|||||||
}
|
}
|
||||||
uint64_t getDWOId() const { return DWOId; }
|
uint64_t getDWOId() const { return DWOId; }
|
||||||
void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
|
void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
|
||||||
|
bool getSplitDebugInlining() const { return SplitDebugInlining; }
|
||||||
|
void setSplitDebugInlining(bool SplitDebugInlining) {
|
||||||
|
this->SplitDebugInlining = SplitDebugInlining;
|
||||||
|
}
|
||||||
|
|
||||||
MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
|
MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
|
||||||
MDString *getRawFlags() const { return getOperandAs<MDString>(2); }
|
MDString *getRawFlags() const { return getOperandAs<MDString>(2); }
|
||||||
|
@ -3969,14 +3969,16 @@ bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) {
|
|||||||
OPTIONAL(globals, MDField, ); \
|
OPTIONAL(globals, MDField, ); \
|
||||||
OPTIONAL(imports, MDField, ); \
|
OPTIONAL(imports, MDField, ); \
|
||||||
OPTIONAL(macros, MDField, ); \
|
OPTIONAL(macros, MDField, ); \
|
||||||
OPTIONAL(dwoId, MDUnsignedField, );
|
OPTIONAL(dwoId, MDUnsignedField, ); \
|
||||||
|
OPTIONAL(splitDebugInlining, MDBoolField, = true);
|
||||||
PARSE_MD_FIELDS();
|
PARSE_MD_FIELDS();
|
||||||
#undef VISIT_MD_FIELDS
|
#undef VISIT_MD_FIELDS
|
||||||
|
|
||||||
Result = DICompileUnit::getDistinct(
|
Result = DICompileUnit::getDistinct(
|
||||||
Context, language.Val, file.Val, producer.Val, isOptimized.Val, flags.Val,
|
Context, language.Val, file.Val, producer.Val, isOptimized.Val, flags.Val,
|
||||||
runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val,
|
runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val,
|
||||||
retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val);
|
retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val,
|
||||||
|
splitDebugInlining.Val);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2452,7 +2452,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case bitc::METADATA_COMPILE_UNIT: {
|
case bitc::METADATA_COMPILE_UNIT: {
|
||||||
if (Record.size() < 14 || Record.size() > 16)
|
if (Record.size() < 14 || Record.size() > 17)
|
||||||
return error("Invalid record");
|
return error("Invalid record");
|
||||||
|
|
||||||
// Ignore Record[0], which indicates whether this compile unit is
|
// Ignore Record[0], which indicates whether this compile unit is
|
||||||
@ -2464,7 +2464,8 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|||||||
Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
|
Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
|
||||||
getMDOrNull(Record[12]), getMDOrNull(Record[13]),
|
getMDOrNull(Record[12]), getMDOrNull(Record[13]),
|
||||||
Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
|
Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
|
||||||
Record.size() <= 14 ? 0 : Record[14]);
|
Record.size() <= 14 ? 0 : Record[14],
|
||||||
|
Record.size() <= 16 ? true : Record[16]);
|
||||||
|
|
||||||
MetadataList.assignValue(CU, NextMetadataNo++);
|
MetadataList.assignValue(CU, NextMetadataNo++);
|
||||||
|
|
||||||
|
@ -1564,6 +1564,7 @@ void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,
|
|||||||
Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
|
Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
|
||||||
Record.push_back(N->getDWOId());
|
Record.push_back(N->getDWOId());
|
||||||
Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));
|
Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));
|
||||||
|
Record.push_back(N->getSplitDebugInlining());
|
||||||
|
|
||||||
Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);
|
Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);
|
||||||
Record.clear();
|
Record.clear();
|
||||||
|
@ -352,7 +352,8 @@ bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
|
|||||||
template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
|
template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
|
||||||
F(CU);
|
F(CU);
|
||||||
if (auto *SkelCU = CU.getSkeleton())
|
if (auto *SkelCU = CU.getSkeleton())
|
||||||
F(*SkelCU);
|
if (CU.getCUNode()->getSplitDebugInlining())
|
||||||
|
F(*SkelCU);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||||
@ -1155,7 +1156,8 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
|
|
||||||
TheCU.constructSubprogramScopeDIE(FnScope);
|
TheCU.constructSubprogramScopeDIE(FnScope);
|
||||||
if (auto *SkelCU = TheCU.getSkeleton())
|
if (auto *SkelCU = TheCU.getSkeleton())
|
||||||
if (!LScopes.getAbstractScopesList().empty())
|
if (!LScopes.getAbstractScopesList().empty() &&
|
||||||
|
TheCU.getCUNode()->getSplitDebugInlining())
|
||||||
SkelCU->constructSubprogramScopeDIE(FnScope);
|
SkelCU->constructSubprogramScopeDIE(FnScope);
|
||||||
|
|
||||||
// Clear debug info
|
// Clear debug info
|
||||||
|
@ -1409,7 +1409,7 @@ struct MDFieldPrinter {
|
|||||||
bool ShouldSkipNull = true);
|
bool ShouldSkipNull = true);
|
||||||
template <class IntTy>
|
template <class IntTy>
|
||||||
void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
|
void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
|
||||||
void printBool(StringRef Name, bool Value);
|
void printBool(StringRef Name, bool Value, Optional<bool> Default = None);
|
||||||
void printDIFlags(StringRef Name, unsigned Flags);
|
void printDIFlags(StringRef Name, unsigned Flags);
|
||||||
template <class IntTy, class Stringifier>
|
template <class IntTy, class Stringifier>
|
||||||
void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,
|
void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,
|
||||||
@ -1472,7 +1472,10 @@ void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {
|
|||||||
Out << FS << Name << ": " << Int;
|
Out << FS << Name << ": " << Int;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MDFieldPrinter::printBool(StringRef Name, bool Value) {
|
void MDFieldPrinter::printBool(StringRef Name, bool Value,
|
||||||
|
Optional<bool> Default) {
|
||||||
|
if (Default && Value == *Default)
|
||||||
|
return;
|
||||||
Out << FS << Name << ": " << (Value ? "true" : "false");
|
Out << FS << Name << ": " << (Value ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1666,6 +1669,7 @@ static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N,
|
|||||||
Printer.printMetadata("imports", N->getRawImportedEntities());
|
Printer.printMetadata("imports", N->getRawImportedEntities());
|
||||||
Printer.printMetadata("macros", N->getRawMacros());
|
Printer.printMetadata("macros", N->getRawMacros());
|
||||||
Printer.printInt("dwoId", N->getDWOId());
|
Printer.printInt("dwoId", N->getDWOId());
|
||||||
|
Printer.printBool("splitDebugInlining", N->getSplitDebugInlining(), true);
|
||||||
Out << ")";
|
Out << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,8 @@ static DIScope *getNonCompileUnitScope(DIScope *N) {
|
|||||||
DICompileUnit *DIBuilder::createCompileUnit(
|
DICompileUnit *DIBuilder::createCompileUnit(
|
||||||
unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer,
|
unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer,
|
||||||
bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
|
bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
|
||||||
DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId) {
|
DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId,
|
||||||
|
bool SplitDebugInlining) {
|
||||||
|
|
||||||
assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
|
assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
|
||||||
(Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
|
(Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
|
||||||
@ -123,7 +124,7 @@ DICompileUnit *DIBuilder::createCompileUnit(
|
|||||||
CUNode = DICompileUnit::getDistinct(
|
CUNode = DICompileUnit::getDistinct(
|
||||||
VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
|
VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
|
||||||
isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr,
|
isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr,
|
||||||
nullptr, nullptr, nullptr, DWOId);
|
nullptr, nullptr, nullptr, DWOId, SplitDebugInlining);
|
||||||
|
|
||||||
// Create a named metadata so that it is easier to find cu in a module.
|
// Create a named metadata so that it is easier to find cu in a module.
|
||||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
|
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
|
||||||
|
@ -361,7 +361,8 @@ DICompileUnit *DICompileUnit::getImpl(
|
|||||||
unsigned RuntimeVersion, MDString *SplitDebugFilename,
|
unsigned RuntimeVersion, MDString *SplitDebugFilename,
|
||||||
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
|
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
|
||||||
Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros,
|
Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros,
|
||||||
uint64_t DWOId, StorageType Storage, bool ShouldCreate) {
|
uint64_t DWOId, bool SplitDebugInlining, StorageType Storage,
|
||||||
|
bool ShouldCreate) {
|
||||||
assert(Storage != Uniqued && "Cannot unique DICompileUnit");
|
assert(Storage != Uniqued && "Cannot unique DICompileUnit");
|
||||||
assert(isCanonical(Producer) && "Expected canonical MDString");
|
assert(isCanonical(Producer) && "Expected canonical MDString");
|
||||||
assert(isCanonical(Flags) && "Expected canonical MDString");
|
assert(isCanonical(Flags) && "Expected canonical MDString");
|
||||||
@ -371,9 +372,10 @@ DICompileUnit *DICompileUnit::getImpl(
|
|||||||
File, Producer, Flags, SplitDebugFilename,
|
File, Producer, Flags, SplitDebugFilename,
|
||||||
EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities,
|
EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities,
|
||||||
Macros};
|
Macros};
|
||||||
return storeImpl(new (array_lengthof(Ops)) DICompileUnit(
|
return storeImpl(new (array_lengthof(Ops))
|
||||||
Context, Storage, SourceLanguage, IsOptimized,
|
DICompileUnit(Context, Storage, SourceLanguage,
|
||||||
RuntimeVersion, EmissionKind, DWOId, Ops),
|
IsOptimized, RuntimeVersion, EmissionKind,
|
||||||
|
DWOId, SplitDebugInlining, Ops),
|
||||||
Storage);
|
Storage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,18 +22,18 @@
|
|||||||
splitDebugFilename: "abc.debug",
|
splitDebugFilename: "abc.debug",
|
||||||
emissionKind: FullDebug,
|
emissionKind: FullDebug,
|
||||||
enums: !2, retainedTypes: !3,
|
enums: !2, retainedTypes: !3,
|
||||||
globals: !5, imports: !6, macros: !7, dwoId: 42)
|
globals: !5, imports: !6, macros: !7, dwoId: 42, splitDebugInlining: true)
|
||||||
|
|
||||||
; CHECK: !9 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
|
; CHECK: !9 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
|
||||||
!9 = distinct !DICompileUnit(language: 12, file: !1, producer: "",
|
!9 = distinct !DICompileUnit(language: 12, file: !1, producer: "",
|
||||||
isOptimized: false, flags: "", runtimeVersion: 0,
|
isOptimized: false, flags: "", runtimeVersion: 0,
|
||||||
splitDebugFilename: "", emissionKind: NoDebug)
|
splitDebugFilename: "", emissionKind: NoDebug)
|
||||||
|
|
||||||
; CHECK: !10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, flags: "-O2", runtimeVersion: 2, splitDebugFilename: "abc.debug", emissionKind: LineTablesOnly)
|
; CHECK: !10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, flags: "-O2", runtimeVersion: 2, splitDebugFilename: "abc.debug", emissionKind: LineTablesOnly, splitDebugInlining: false)
|
||||||
!10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang",
|
!10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang",
|
||||||
isOptimized: true, flags: "-O2", runtimeVersion: 2,
|
isOptimized: true, flags: "-O2", runtimeVersion: 2,
|
||||||
splitDebugFilename: "abc.debug",
|
splitDebugFilename: "abc.debug",
|
||||||
emissionKind: LineTablesOnly)
|
emissionKind: LineTablesOnly, splitDebugInlining: false)
|
||||||
|
|
||||||
!llvm.module.flags = !{!11}
|
!llvm.module.flags = !{!11}
|
||||||
!11 = !{i32 2, !"Debug Info Version", i32 3}
|
!11 = !{i32 2, !"Debug Info Version", i32 3}
|
||||||
|
41
test/DebugInfo/X86/fission-no-inlining.ll
Normal file
41
test/DebugInfo/X86/fission-no-inlining.ll
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
; RUN: llc -split-dwarf=Enable -O0 < %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK-NOT: DW_TAG_subprogram
|
||||||
|
|
||||||
|
; IR generated from the following source:
|
||||||
|
; void f1();
|
||||||
|
; inline __attribute__((always_inline)) void f2() {
|
||||||
|
; f1();
|
||||||
|
; }
|
||||||
|
; void f3() {
|
||||||
|
; f2();
|
||||||
|
; }
|
||||||
|
|
||||||
|
; Function Attrs: uwtable
|
||||||
|
define void @_Z2f3v() #0 !dbg !5 {
|
||||||
|
entry:
|
||||||
|
call void @_Z2f1v(), !dbg !8
|
||||||
|
ret void, !dbg !11
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @_Z2f1v() #1
|
||||||
|
|
||||||
|
attributes #0 = { uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
|
||||||
|
!llvm.dbg.cu = !{!0}
|
||||||
|
!llvm.module.flags = !{!3}
|
||||||
|
!llvm.ident = !{!4}
|
||||||
|
|
||||||
|
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 4.0.0 (trunk 279571) (llvm/trunk 279602)", isOptimized: false, runtimeVersion: 0, splitDebugFilename: "fission-no-inlining.dwo", emissionKind: FullDebug, enums: !2, splitDebugInlining: false)
|
||||||
|
!1 = !DIFile(filename: "fission-no-inlining.cpp", directory: "/tmp/dbginfo")
|
||||||
|
!2 = !{}
|
||||||
|
!3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||||
|
!4 = !{!"clang version 4.0.0 (trunk 279571) (llvm/trunk 279602)"}
|
||||||
|
!5 = distinct !DISubprogram(name: "f3", linkageName: "_Z2f3v", scope: !1, file: !1, line: 5, type: !6, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||||
|
!6 = !DISubroutineType(types: !7)
|
||||||
|
!7 = !{null}
|
||||||
|
!8 = !DILocation(line: 3, column: 3, scope: !9, inlinedAt: !10)
|
||||||
|
!9 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", scope: !1, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||||
|
!10 = distinct !DILocation(line: 6, column: 3, scope: !5)
|
||||||
|
!11 = !DILocation(line: 7, column: 1, scope: !5)
|
@ -94,7 +94,7 @@ protected:
|
|||||||
return DICompileUnit::getDistinct(Context, 1, getFile(), "clang", false,
|
return DICompileUnit::getDistinct(Context, 1, getFile(), "clang", false,
|
||||||
"-g", 2, "", DICompileUnit::FullDebug,
|
"-g", 2, "", DICompileUnit::FullDebug,
|
||||||
getTuple(), getTuple(), getTuple(),
|
getTuple(), getTuple(), getTuple(),
|
||||||
getTuple(), getTuple(), 0);
|
getTuple(), getTuple(), 0, true);
|
||||||
}
|
}
|
||||||
DIType *getBasicType(StringRef Name) {
|
DIType *getBasicType(StringRef Name) {
|
||||||
return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name);
|
return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name);
|
||||||
@ -1391,8 +1391,7 @@ TEST_F(DICompileUnitTest, get) {
|
|||||||
auto *N = DICompileUnit::getDistinct(
|
auto *N = DICompileUnit::getDistinct(
|
||||||
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
|
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
|
||||||
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
|
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
|
||||||
RetainedTypes, GlobalVariables, ImportedEntities, Macros,
|
RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, true);
|
||||||
DWOId);
|
|
||||||
|
|
||||||
EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag());
|
EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag());
|
||||||
EXPECT_EQ(SourceLanguage, N->getSourceLanguage());
|
EXPECT_EQ(SourceLanguage, N->getSourceLanguage());
|
||||||
@ -1449,7 +1448,7 @@ TEST_F(DICompileUnitTest, replaceArrays) {
|
|||||||
auto *N = DICompileUnit::getDistinct(
|
auto *N = DICompileUnit::getDistinct(
|
||||||
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
|
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
|
||||||
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
|
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
|
||||||
RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId);
|
RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId, true);
|
||||||
|
|
||||||
auto *GlobalVariables = MDTuple::getDistinct(Context, None);
|
auto *GlobalVariables = MDTuple::getDistinct(Context, None);
|
||||||
EXPECT_EQ(nullptr, N->getGlobalVariables().get());
|
EXPECT_EQ(nullptr, N->getGlobalVariables().get());
|
||||||
|
Loading…
Reference in New Issue
Block a user