Index: include/llvm/Target/TargetOptions.h =================================================================== --- include/llvm/Target/TargetOptions.h +++ include/llvm/Target/TargetOptions.h @@ -108,7 +108,7 @@ DisableIntegratedAS(false), CompressDebugSections(false), RelaxELFRelocations(false), FunctionSections(false), DataSections(false), UniqueSectionNames(true), TrapUnreachable(false), - EmulatedTLS(false), EnableIPRA(false), + EmulatedTLS(false), EnableIPRA(false), ProfileDebug(false), FloatABIType(FloatABI::Default), AllowFPOpFusion(FPOpFusion::Standard), ThreadModel(ThreadModel::POSIX), @@ -225,6 +225,9 @@ /// This flag enables InterProcedural Register Allocation (IPRA). unsigned EnableIPRA : 1; + /// This flag enables emitting extra debug info for sample profiling. + unsigned ProfileDebug : 1; + /// FloatABIType - This setting is set by -float-abi=xxx option is specfied /// on the command line. This setting may either be Default, Soft, or Hard. /// Default selects the target's default behavior. Soft selects the ABI for @@ -299,7 +302,8 @@ ARE_EQUAL(FPDenormalMode) && ARE_EQUAL(ExceptionModel) && ARE_EQUAL(MCOptions) && - ARE_EQUAL(EnableIPRA); + ARE_EQUAL(EnableIPRA) && + ARE_EQUAL(ProfileDebug); #undef ARE_EQUAL } Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1137,8 +1137,10 @@ TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd())); // Under -gmlt, skip building the subprogram if there are no inlined - // subroutines inside it. - if (TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly && + // subroutines inside it. But with -fprofile-debug, the subprogram is still + // needed as we need its source location. + if (!Asm->TM.Options.ProfileDebug && + TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly && LScopes.getAbstractScopesList().empty() && !IsDarwin) { assert(InfoHolder.getScopeVariables().empty()); assert(DbgValues.empty()); Index: lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1185,7 +1185,9 @@ void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool Minimal) { - if (!Minimal) + // If -fprofile-debug is enabled, need to emit the subprogram and its source + // location. + if (Asm->TM.Options.ProfileDebug || !Minimal) if (applySubprogramDefinitionAttributes(SP, SPDie)) return; @@ -1193,12 +1195,13 @@ if (!SP->getName().empty()) addString(SPDie, dwarf::DW_AT_name, SP->getName()); + if (Asm->TM.Options.ProfileDebug || !Minimal) + addSourceLine(SPDie, SP); + // Skip the rest of the attributes under -gmlt to save space. if (Minimal) return; - addSourceLine(SPDie, SP); - // Add the prototype if we have a prototype and we have a C like // language. uint16_t Language = getLanguage();