[DebugInfo] Add another level to DebugInfoKind called Constructor

The option will limit debug info by only emitting complete class
type information when its constructor is emitted.
This patch changes comparisons with LimitedDebugInfo to use the new
level instead.

Differential Revision: https://reviews.llvm.org/D72427
This commit is contained in:
Amy Huang 2020-01-13 15:54:54 -08:00
parent c774840492
commit 53539bb032
11 changed files with 43 additions and 37 deletions

View File

@ -357,6 +357,11 @@ public:
/// Check if CSIR profile use is on. /// Check if CSIR profile use is on.
bool hasProfileCSIRUse() const { return getProfileUse() == ProfileCSIRInstr; } bool hasProfileCSIRUse() const { return getProfileUse() == ProfileCSIRInstr; }
/// Check if type and variable info should be emitted.
bool hasReducedDebugInfo() const {
return getDebugInfo() >= codegenoptions::DebugInfoConstructor;
}
}; };
} // end namespace clang } // end namespace clang

View File

@ -34,6 +34,11 @@ enum DebugInfoKind {
/// (-gline-tables-only). /// (-gline-tables-only).
DebugLineTablesOnly, DebugLineTablesOnly,
/// Limit generated debug info for classes to reduce size. This emits class
/// type info only where the constructor is emitted, if it is a class that
/// has a constructor.
DebugInfoConstructor,
/// Limit generated debug info to reduce size (-fno-standalone-debug). This /// Limit generated debug info to reduce size (-fno-standalone-debug). This
/// emits forward decls for types that could be replaced with forward decls in /// emits forward decls for types that could be replaced with forward decls in
/// the source code. For dynamic C++ classes type info is only emitted into /// the source code. For dynamic C++ classes type info is only emitted into

View File

@ -1483,8 +1483,7 @@ void CodeGenFunction::setBlockContextParameter(const ImplicitParamDecl *D,
Address alloc = CreateMemTemp(D->getType(), D->getName() + ".addr"); Address alloc = CreateMemTemp(D->getType(), D->getName() + ".addr");
Builder.CreateStore(arg, alloc); Builder.CreateStore(arg, alloc);
if (CGDebugInfo *DI = getDebugInfo()) { if (CGDebugInfo *DI = getDebugInfo()) {
if (CGM.getCodeGenOpts().getDebugInfo() >= if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
codegenoptions::LimitedDebugInfo) {
DI->setLocation(D->getLocation()); DI->setLocation(D->getLocation());
DI->EmitDeclareOfBlockLiteralArgVariable( DI->EmitDeclareOfBlockLiteralArgVariable(
*BlockInfo, D->getName(), argNum, *BlockInfo, D->getName(), argNum,
@ -1656,8 +1655,7 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD,
const VarDecl *variable = CI.getVariable(); const VarDecl *variable = CI.getVariable();
DI->EmitLocation(Builder, variable->getLocation()); DI->EmitLocation(Builder, variable->getLocation());
if (CGM.getCodeGenOpts().getDebugInfo() >= if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
codegenoptions::LimitedDebugInfo) {
const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable); const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
if (capture.isConstant()) { if (capture.isConstant()) {
auto addr = LocalDeclMap.find(variable)->second; auto addr = LocalDeclMap.find(variable)->second;

View File

@ -591,6 +591,7 @@ void CGDebugInfo::CreateCompileUnit() {
case codegenoptions::DebugDirectivesOnly: case codegenoptions::DebugDirectivesOnly:
EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly; EmissionKind = llvm::DICompileUnit::DebugDirectivesOnly;
break; break;
case codegenoptions::DebugInfoConstructor:
case codegenoptions::LimitedDebugInfo: case codegenoptions::LimitedDebugInfo:
case codegenoptions::FullDebugInfo: case codegenoptions::FullDebugInfo:
EmissionKind = llvm::DICompileUnit::FullDebug; EmissionKind = llvm::DICompileUnit::FullDebug;
@ -2043,7 +2044,7 @@ void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy, llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy,
SourceLocation Loc) { SourceLocation Loc) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc)); llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
return T; return T;
} }
@ -2055,7 +2056,7 @@ llvm::DIType *CGDebugInfo::getOrCreateInterfaceType(QualType D,
llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D, llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
SourceLocation Loc) { SourceLocation Loc) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
assert(!D.isNull() && "null type"); assert(!D.isNull() && "null type");
llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc)); llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
assert(T && "could not create debug info for type"); assert(T && "could not create debug info for type");
@ -3270,7 +3271,7 @@ void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,
DebugKind <= codegenoptions::DebugLineTablesOnly)) DebugKind <= codegenoptions::DebugLineTablesOnly))
LinkageName = StringRef(); LinkageName = StringRef();
if (DebugKind >= codegenoptions::LimitedDebugInfo) { if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
if (const NamespaceDecl *NSDecl = if (const NamespaceDecl *NSDecl =
dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext())) dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
FDContext = getOrCreateNamespace(NSDecl); FDContext = getOrCreateNamespace(NSDecl);
@ -3957,7 +3958,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
llvm::Optional<unsigned> ArgNo, llvm::Optional<unsigned> ArgNo,
CGBuilderTy &Builder, CGBuilderTy &Builder,
const bool UsePointerValue) { const bool UsePointerValue) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
if (VD->hasAttr<NoDebugAttr>()) if (VD->hasAttr<NoDebugAttr>())
return nullptr; return nullptr;
@ -4091,12 +4092,12 @@ llvm::DILocalVariable *
CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage, CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD, llvm::Value *Storage,
CGBuilderTy &Builder, CGBuilderTy &Builder,
const bool UsePointerValue) { const bool UsePointerValue) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
return EmitDeclare(VD, Storage, llvm::None, Builder, UsePointerValue); return EmitDeclare(VD, Storage, llvm::None, Builder, UsePointerValue);
} }
void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) { void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
if (D->hasAttr<NoDebugAttr>()) if (D->hasAttr<NoDebugAttr>())
@ -4132,7 +4133,7 @@ llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy,
void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable( void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder, const VarDecl *VD, llvm::Value *Storage, CGBuilderTy &Builder,
const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) { const CGBlockInfo &blockInfo, llvm::Instruction *InsertPoint) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
if (Builder.GetInsertBlock() == nullptr) if (Builder.GetInsertBlock() == nullptr)
@ -4203,7 +4204,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI, void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
unsigned ArgNo, unsigned ArgNo,
CGBuilderTy &Builder) { CGBuilderTy &Builder) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
EmitDeclare(VD, AI, ArgNo, Builder); EmitDeclare(VD, AI, ArgNo, Builder);
} }
@ -4260,7 +4261,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
unsigned ArgNo, unsigned ArgNo,
llvm::AllocaInst *Alloca, llvm::AllocaInst *Alloca,
CGBuilderTy &Builder) { CGBuilderTy &Builder) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
ASTContext &C = CGM.getContext(); ASTContext &C = CGM.getContext();
const BlockDecl *blockDecl = block.getBlockDecl(); const BlockDecl *blockDecl = block.getBlockDecl();
@ -4426,7 +4427,7 @@ llvm::DIGlobalVariableExpression *CGDebugInfo::CollectAnonRecordDecls(
void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
const VarDecl *D) { const VarDecl *D) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
if (D->hasAttr<NoDebugAttr>()) if (D->hasAttr<NoDebugAttr>())
return; return;
@ -4495,7 +4496,7 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
} }
void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) { void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
if (VD->hasAttr<NoDebugAttr>()) if (VD->hasAttr<NoDebugAttr>())
return; return;
llvm::TimeTraceScope TimeScope("DebugConstGlobalVariable", [&]() { llvm::TimeTraceScope TimeScope("DebugConstGlobalVariable", [&]() {
@ -4594,7 +4595,7 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var, void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
const VarDecl *D) { const VarDecl *D) {
assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
if (D->hasAttr<NoDebugAttr>()) if (D->hasAttr<NoDebugAttr>())
return; return;
@ -4619,7 +4620,7 @@ llvm::DIScope *CGDebugInfo::getCurrentContextDescriptor(const Decl *D) {
} }
void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) { void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
return; return;
const NamespaceDecl *NSDecl = UD.getNominatedNamespace(); const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
if (!NSDecl->isAnonymousNamespace() || if (!NSDecl->isAnonymousNamespace() ||
@ -4632,7 +4633,7 @@ void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
} }
void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) { void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) {
if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
return; return;
assert(UD.shadow_size() && assert(UD.shadow_size() &&
"We shouldn't be codegening an invalid UsingDecl containing no decls"); "We shouldn't be codegening an invalid UsingDecl containing no decls");
@ -4673,7 +4674,7 @@ void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {
llvm::DIImportedEntity * llvm::DIImportedEntity *
CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) { CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
return nullptr; return nullptr;
auto &VH = NamespaceAliasCache[&NA]; auto &VH = NamespaceAliasCache[&NA];
if (VH) if (VH)
@ -4795,7 +4796,7 @@ void CGDebugInfo::finalize() {
} }
void CGDebugInfo::EmitExplicitCastType(QualType Ty) { void CGDebugInfo::EmitExplicitCastType(QualType Ty) {
if (CGM.getCodeGenOpts().getDebugInfo() < codegenoptions::LimitedDebugInfo) if (!CGM.getCodeGenOpts().hasReducedDebugInfo())
return; return;
if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile())) if (auto *DieTy = getOrCreateType(Ty, TheCU->getFile()))

View File

@ -446,8 +446,7 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D,
// Emit global variable debug descriptor for static vars. // Emit global variable debug descriptor for static vars.
CGDebugInfo *DI = getDebugInfo(); CGDebugInfo *DI = getDebugInfo();
if (DI && if (DI && CGM.getCodeGenOpts().hasReducedDebugInfo()) {
CGM.getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo) {
DI->setLocation(D.getLocation()); DI->setLocation(D.getLocation());
DI->EmitGlobalVariable(var, &D); DI->EmitGlobalVariable(var, &D);
} }
@ -1394,8 +1393,7 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
EmitVariablyModifiedType(Ty); EmitVariablyModifiedType(Ty);
auto *DI = getDebugInfo(); auto *DI = getDebugInfo();
bool EmitDebugInfo = DI && CGM.getCodeGenOpts().getDebugInfo() >= bool EmitDebugInfo = DI && CGM.getCodeGenOpts().hasReducedDebugInfo();
codegenoptions::LimitedDebugInfo;
Address address = Address::invalid(); Address address = Address::invalid();
Address AllocaAddr = Address::invalid(); Address AllocaAddr = Address::invalid();
@ -2496,9 +2494,7 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
// Emit debug info for param declarations in non-thunk functions. // Emit debug info for param declarations in non-thunk functions.
if (CGDebugInfo *DI = getDebugInfo()) { if (CGDebugInfo *DI = getDebugInfo()) {
if (CGM.getCodeGenOpts().getDebugInfo() >= if (CGM.getCodeGenOpts().hasReducedDebugInfo() && !CurFuncIsThunk) {
codegenoptions::LimitedDebugInfo &&
!CurFuncIsThunk) {
DI->EmitDeclareOfArgVariable(&D, DeclPtr.getPointer(), ArgNo, Builder); DI->EmitDeclareOfArgVariable(&D, DeclPtr.getPointer(), ArgNo, Builder);
} }
} }

View File

@ -562,8 +562,7 @@ void CodeGenFunction::EmitLabel(const LabelDecl *D) {
// Emit debug info for labels. // Emit debug info for labels.
if (CGDebugInfo *DI = getDebugInfo()) { if (CGDebugInfo *DI = getDebugInfo()) {
if (CGM.getCodeGenOpts().getDebugInfo() >= if (CGM.getCodeGenOpts().hasReducedDebugInfo()) {
codegenoptions::LimitedDebugInfo) {
DI->setLocation(D->getLocation()); DI->setLocation(D->getLocation());
DI->EmitLabel(D, Builder); DI->EmitLabel(D, Builder);
} }

View File

@ -567,8 +567,7 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S) {
const CapturedDecl *CD = S.getCapturedDecl(); const CapturedDecl *CD = S.getCapturedDecl();
// Build the argument list. // Build the argument list.
bool NeedWrapperFunction = bool NeedWrapperFunction =
getDebugInfo() && getDebugInfo() && CGM.getCodeGenOpts().hasReducedDebugInfo();
CGM.getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo;
FunctionArgList Args; FunctionArgList Args;
llvm::MapVector<const Decl *, std::pair<const VarDecl *, Address>> LocalAddrs; llvm::MapVector<const Decl *, std::pair<const VarDecl *, Address>> LocalAddrs;
llvm::DenseMap<const Decl *, std::pair<const Expr *, llvm::Value *>> VLASizes; llvm::DenseMap<const Decl *, std::pair<const Expr *, llvm::Value *>> VLASizes;

View File

@ -2110,7 +2110,7 @@ void CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E,
const APValue &Init) { const APValue &Init) {
assert(Init.hasValue() && "Invalid DeclRefExpr initializer!"); assert(Init.hasValue() && "Invalid DeclRefExpr initializer!");
if (CGDebugInfo *Dbg = getDebugInfo()) if (CGDebugInfo *Dbg = getDebugInfo())
if (CGM.getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo) if (CGM.getCodeGenOpts().hasReducedDebugInfo())
Dbg->EmitGlobalVariable(E->getDecl(), Init); Dbg->EmitGlobalVariable(E->getDecl(), Init);
} }

View File

@ -4118,13 +4118,13 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
// Emit global variable debug information. // Emit global variable debug information.
if (CGDebugInfo *DI = getModuleDebugInfo()) if (CGDebugInfo *DI = getModuleDebugInfo())
if (getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo) if (getCodeGenOpts().hasReducedDebugInfo())
DI->EmitGlobalVariable(GV, D); DI->EmitGlobalVariable(GV, D);
} }
void CodeGenModule::EmitExternalVarDeclaration(const VarDecl *D) { void CodeGenModule::EmitExternalVarDeclaration(const VarDecl *D) {
if (CGDebugInfo *DI = getModuleDebugInfo()) if (CGDebugInfo *DI = getModuleDebugInfo())
if (getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo) { if (getCodeGenOpts().hasReducedDebugInfo()) {
QualType ASTTy = D->getType(); QualType ASTTy = D->getType();
llvm::Type *Ty = getTypes().ConvertTypeForMem(D->getType()); llvm::Type *Ty = getTypes().ConvertTypeForMem(D->getType());
llvm::PointerType *PTy = llvm::PointerType *PTy =
@ -5371,7 +5371,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
ObjCRuntime->GenerateClass(OMD); ObjCRuntime->GenerateClass(OMD);
// Emit global variable debug information. // Emit global variable debug information.
if (CGDebugInfo *DI = getModuleDebugInfo()) if (CGDebugInfo *DI = getModuleDebugInfo())
if (getCodeGenOpts().getDebugInfo() >= codegenoptions::LimitedDebugInfo) if (getCodeGenOpts().hasReducedDebugInfo())
DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType( DI->getOrCreateInterfaceType(getContext().getObjCInterfaceType(
OMD->getClassInterface()), OMD->getLocation()); OMD->getClassInterface()), OMD->getLocation());
break; break;

View File

@ -999,6 +999,9 @@ static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
case codegenoptions::DebugLineTablesOnly: case codegenoptions::DebugLineTablesOnly:
CmdArgs.push_back("-debug-info-kind=line-tables-only"); CmdArgs.push_back("-debug-info-kind=line-tables-only");
break; break;
case codegenoptions::DebugInfoConstructor:
CmdArgs.push_back("-debug-info-kind=constructor");
break;
case codegenoptions::LimitedDebugInfo: case codegenoptions::LimitedDebugInfo:
CmdArgs.push_back("-debug-info-kind=limited"); CmdArgs.push_back("-debug-info-kind=limited");
break; break;

View File

@ -731,6 +731,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
llvm::StringSwitch<unsigned>(A->getValue()) llvm::StringSwitch<unsigned>(A->getValue())
.Case("line-tables-only", codegenoptions::DebugLineTablesOnly) .Case("line-tables-only", codegenoptions::DebugLineTablesOnly)
.Case("line-directives-only", codegenoptions::DebugDirectivesOnly) .Case("line-directives-only", codegenoptions::DebugDirectivesOnly)
.Case("constructor", codegenoptions::DebugInfoConstructor)
.Case("limited", codegenoptions::LimitedDebugInfo) .Case("limited", codegenoptions::LimitedDebugInfo)
.Case("standalone", codegenoptions::FullDebugInfo) .Case("standalone", codegenoptions::FullDebugInfo)
.Default(~0U); .Default(~0U);
@ -787,8 +788,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
llvm::Triple::arm, llvm::Triple::armeb}; llvm::Triple::arm, llvm::Triple::armeb};
llvm::Triple T(TargetOpts.Triple); llvm::Triple T(TargetOpts.Triple);
if (Opts.OptimizationLevel > 0 && if (Opts.OptimizationLevel > 0 && Opts.hasReducedDebugInfo() &&
Opts.getDebugInfo() >= codegenoptions::LimitedDebugInfo &&
llvm::is_contained(DebugEntryValueArchs, T.getArch())) llvm::is_contained(DebugEntryValueArchs, T.getArch()))
Opts.EnableDebugEntryValues = Args.hasArg(OPT_femit_debug_entry_values); Opts.EnableDebugEntryValues = Args.hasArg(OPT_femit_debug_entry_values);