awpandey created this revision.
awpandey added reviewers: dblaikie, aprantl, probinson, jini.susan.george.
awpandey added projects: debug-info, LLVM, clang.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya.
This patch adds //dw_at_const_expr// flag for the constant variable or
functions in C++
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D73261
Files:
clang/lib/CodeGen/CGDebugInfo.cpp
clang/test/CodeGenCXX/constExpr.cpp
clang/test/CodeGenCXX/dbg-info-all-calls-described.cpp
llvm/include/llvm/IR/DIBuilder.h
llvm/include/llvm/IR/DebugInfoMetadata.h
llvm/lib/AsmParser/LLParser.cpp
llvm/lib/Bitcode/Reader/MetadataLoader.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
llvm/lib/IR/AsmWriter.cpp
llvm/lib/IR/DIBuilder.cpp
llvm/lib/IR/DebugInfo.cpp
llvm/lib/IR/DebugInfoMetadata.cpp
llvm/lib/IR/LLVMContextImpl.h
llvm/unittests/CodeGen/MachineInstrTest.cpp
llvm/unittests/IR/IRBuilderTest.cpp
llvm/unittests/IR/MetadataTest.cpp
Index: llvm/unittests/IR/MetadataTest.cpp
===================================================================
--- llvm/unittests/IR/MetadataTest.cpp
+++ llvm/unittests/IR/MetadataTest.cpp
@@ -86,7 +86,7 @@
DISubprogram *getSubprogram() {
return DISubprogram::getDistinct(
Context, nullptr, "", "", nullptr, 0, nullptr, 0, nullptr, 0, 0,
- DINode::FlagZero, DISubprogram::SPFlagZero, nullptr);
+ DINode::FlagZero, DISubprogram::SPFlagZero, false, nullptr);
}
DIFile *getFile() {
return DIFile::getDistinct(Context, "file.c", "/path/to/dir");
@@ -927,12 +927,12 @@
{
// Different function, same inlined-at.
auto *F = getFile();
- auto *SP1 = DISubprogram::getDistinct(Context, F, "a", "a", F, 0, nullptr,
- 0, nullptr, 0, 0, DINode::FlagZero,
- DISubprogram::SPFlagZero, nullptr);
- auto *SP2 = DISubprogram::getDistinct(Context, F, "b", "b", F, 0, nullptr,
- 0, nullptr, 0, 0, DINode::FlagZero,
- DISubprogram::SPFlagZero, nullptr);
+ auto *SP1 = DISubprogram::getDistinct(
+ Context, F, "a", "a", F, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero,
+ DISubprogram::SPFlagZero, false, nullptr);
+ auto *SP2 = DISubprogram::getDistinct(
+ Context, F, "b", "b", F, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero,
+ DISubprogram::SPFlagZero, false, nullptr);
auto *I = DILocation::get(Context, 2, 7, N);
auto *A = DILocation::get(Context, 1, 6, SP1, I);
@@ -1168,7 +1168,7 @@
DIType *Type = getDerivedType();
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7);
auto *VlaExpr = DILocalVariable::get(Context, Scope, "vla_expr", File, 8,
- Type, 2, Flags, 8);
+ Type, 2, Flags, 8, false);
auto *N = DISubrange::get(Context, VlaExpr, 0);
auto Count = N->getCount();
@@ -1822,7 +1822,7 @@
auto *N = DISubprogram::get(
Context, Scope, Name, LinkageName, File, Line, Type, ScopeLine,
- ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit,
+ ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, Declaration, RetainedNodes, ThrownTypes);
EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag());
@@ -1848,97 +1848,98 @@
EXPECT_EQ(ThrownTypes, N->getThrownTypes().get());
EXPECT_EQ(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, Declaration, RetainedNodes,
ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, getCompositeType(), Name, LinkageName,
File, Line, Type, ScopeLine, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, "other", LinkageName, File,
Line, Type, ScopeLine, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, "other", File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, Declaration, RetainedNodes,
ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, getFile(),
Line, Type, ScopeLine, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File,
Line + 1, Type, ScopeLine, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
getSubroutineType(), ScopeLine, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
+ RetainedNodes, ThrownTypes));
+ EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
+ Type, ScopeLine, ContainingType, VirtualIndex,
+ ThisAdjustment, Flags,
+ SPFlags ^ DISubprogram::SPFlagLocalToUnit,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(
Context, Scope, Name, LinkageName, File, Line, Type,
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
- Flags, SPFlags ^ DISubprogram::SPFlagLocalToUnit, Unit,
- TemplateParams, Declaration, RetainedNodes, ThrownTypes));
- EXPECT_NE(N, DISubprogram::get(
- Context, Scope, Name, LinkageName, File, Line, Type,
- ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
- Flags, SPFlags ^ DISubprogram::SPFlagDefinition, Unit,
+ Flags, SPFlags ^ DISubprogram::SPFlagDefinition, false, Unit,
TemplateParams, Declaration, RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine + 1, ContainingType,
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, getCompositeType(),
VirtualIndex, ThisAdjustment, Flags, SPFlags,
- Unit, TemplateParams, Declaration,
+ false, Unit, TemplateParams, Declaration,
RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(
Context, Scope, Name, LinkageName, File, Line, Type,
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
- Flags, SPFlags ^ DISubprogram::SPFlagVirtual, Unit,
+ Flags, SPFlags ^ DISubprogram::SPFlagVirtual, false, Unit,
TemplateParams, Declaration, RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType,
VirtualIndex + 1, ThisAdjustment, Flags,
- SPFlags, Unit, TemplateParams, Declaration,
- RetainedNodes, ThrownTypes));
+ SPFlags, false, Unit, TemplateParams,
+ Declaration, RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(
Context, Scope, Name, LinkageName, File, Line, Type,
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
- Flags, SPFlags ^ DISubprogram::SPFlagOptimized, Unit,
+ Flags, SPFlags ^ DISubprogram::SPFlagOptimized, false, Unit,
TemplateParams, Declaration, RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, nullptr,
+ ThisAdjustment, Flags, SPFlags, false, nullptr,
TemplateParams, Declaration, RetainedNodes,
ThrownTypes));
- EXPECT_NE(N,
- DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
- Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit, getTuple(),
- Declaration, RetainedNodes, ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
+ getTuple(), Declaration, RetainedNodes,
+ ThrownTypes));
+ EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
+ Type, ScopeLine, ContainingType, VirtualIndex,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, getSubprogram(), RetainedNodes,
ThrownTypes));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, Declaration, getTuple()));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, ScopeLine, ContainingType, VirtualIndex,
- ThisAdjustment, Flags, SPFlags, Unit,
+ ThisAdjustment, Flags, SPFlags, false, Unit,
TemplateParams, Declaration, RetainedNodes,
getTuple()));
@@ -2138,9 +2139,10 @@
uint32_t AlignInBits = 8;
- auto *N = DIGlobalVariable::get(
- Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits);
+ auto *N = DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line,
+ Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, templateParams,
+ AlignInBits, false);
EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag());
EXPECT_EQ(Scope, N->getScope());
@@ -2157,52 +2159,53 @@
EXPECT_EQ(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, Type, IsLocalToUnit, IsDefinition,
StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
- EXPECT_NE(N, DIGlobalVariable::get(
- Context, getSubprogram(), Name, LinkageName, File, Line,
- Type, IsLocalToUnit, IsDefinition,
- StaticDataMemberDeclaration, templateParams, AlignInBits));
+ EXPECT_NE(N,
+ DIGlobalVariable::get(Context, getSubprogram(), Name, LinkageName,
+ File, Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, templateParams,
+ AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, "other", LinkageName, File,
Line, Type, IsLocalToUnit, IsDefinition,
StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, "other", File, Line,
Type, IsLocalToUnit, IsDefinition,
StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName,
getFile(), Line, Type, IsLocalToUnit,
IsDefinition, StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line + 1, Type, IsLocalToUnit,
IsDefinition, StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, getDerivedType(), IsLocalToUnit,
IsDefinition, StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, Type, !IsLocalToUnit, IsDefinition,
StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, Type, IsLocalToUnit, !IsDefinition,
StaticDataMemberDeclaration,
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, Type, IsLocalToUnit, IsDefinition,
cast<DIDerivedType>(getDerivedType()),
- templateParams, AlignInBits));
+ templateParams, AlignInBits, false));
EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
Line, Type, IsLocalToUnit, IsDefinition,
StaticDataMemberDeclaration, nullptr,
- AlignInBits));
- EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
- Line, Type, IsLocalToUnit, IsDefinition,
- StaticDataMemberDeclaration,
- templateParams, (AlignInBits << 1)));
+ AlignInBits, false));
+ EXPECT_NE(N, DIGlobalVariable::get(
+ Context, Scope, Name, LinkageName, File, Line, Type,
+ IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration,
+ templateParams, (AlignInBits << 1), false));
TempDIGlobalVariable Temp = N->clone();
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
@@ -2226,12 +2229,14 @@
cast<DIDerivedType>(getDerivedType());
uint32_t AlignInBits = 8;
- auto *Var = DIGlobalVariable::get(
- Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits);
- auto *Var2 = DIGlobalVariable::get(
- Context, Scope, "other", LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits);
+ auto *Var = DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
+ Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, templateParams,
+ AlignInBits, false);
+ auto *Var2 = DIGlobalVariable::get(Context, Scope, "other", LinkageName, File,
+ Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration,
+ templateParams, AlignInBits, false);
auto *N = DIGlobalVariableExpression::get(Context, Var, Expr);
EXPECT_EQ(Var, N->getVariable());
@@ -2256,9 +2261,8 @@
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7);
uint32_t AlignInBits = 8;
- auto *N =
- DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, Flags,
- AlignInBits);
+ auto *N = DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
+ Flags, AlignInBits, false);
EXPECT_TRUE(N->isParameter());
EXPECT_EQ(Scope, N->getScope());
EXPECT_EQ(Name, N->getName());
@@ -2269,44 +2273,49 @@
EXPECT_EQ(Flags, N->getFlags());
EXPECT_EQ(AlignInBits, N->getAlignInBits());
EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
- Flags, AlignInBits));
+ Flags, AlignInBits, false));
- EXPECT_FALSE(
- DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0, Flags,
- AlignInBits)->isParameter());
+ EXPECT_FALSE(DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0,
+ Flags, AlignInBits, false)
+ ->isParameter());
EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File, Line,
- Type, Arg, Flags, AlignInBits));
+ Type, Arg, Flags, AlignInBits, false));
EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line, Type,
- Arg, Flags, AlignInBits));
+ Arg, Flags, AlignInBits, false));
EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(), Line, Type,
- Arg, Flags, AlignInBits));
+ Arg, Flags, AlignInBits, false));
EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1, Type,
- Arg, Flags, AlignInBits));
+ Arg, Flags, AlignInBits, false));
EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
- getDerivedType(), Arg, Flags, AlignInBits));
- EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type,
- Arg + 1, Flags, AlignInBits));
+ getDerivedType(), Arg, Flags, AlignInBits,
+ false));
EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type,
- Arg, Flags, (AlignInBits << 1)));
+ Arg + 1, Flags, AlignInBits, false));
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
+ Flags, (AlignInBits << 1), false));
TempDILocalVariable Temp = N->clone();
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
TEST_F(DILocalVariableTest, getArg256) {
- EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
- 0, nullptr, 255, DINode::FlagZero, 0)
- ->getArg());
- EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
- 0, nullptr, 256, DINode::FlagZero, 0)
- ->getArg());
- EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
- 0, nullptr, 257, DINode::FlagZero, 0)
- ->getArg());
+ EXPECT_EQ(255u,
+ DILocalVariable::get(Context, getSubprogram(), "", getFile(), 0,
+ nullptr, 255, DINode::FlagZero, 0, false)
+ ->getArg());
+ EXPECT_EQ(256u,
+ DILocalVariable::get(Context, getSubprogram(), "", getFile(), 0,
+ nullptr, 256, DINode::FlagZero, 0, false)
+ ->getArg());
+ EXPECT_EQ(257u,
+ DILocalVariable::get(Context, getSubprogram(), "", getFile(), 0,
+ nullptr, 257, DINode::FlagZero, 0, false)
+ ->getArg());
unsigned Max = UINT16_MAX;
- EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
- 0, nullptr, Max, DINode::FlagZero, 0)
- ->getArg());
+ EXPECT_EQ(Max,
+ DILocalVariable::get(Context, getSubprogram(), "", getFile(), 0,
+ nullptr, Max, DINode::FlagZero, 0, false)
+ ->getArg());
}
typedef MetadataTest DIExpressionTest;
@@ -2903,10 +2912,10 @@
DILocation *InlinedLoc = DILocation::get(Context, 2, 7, Scope);
- DILocalVariable *VarA =
- DILocalVariable::get(Context, Scope, "A", File, 5, Type, 2, Flags, 8);
- DILocalVariable *VarB =
- DILocalVariable::get(Context, Scope, "B", File, 7, Type, 3, Flags, 8);
+ DILocalVariable *VarA = DILocalVariable::get(Context, Scope, "A", File, 5,
+ Type, 2, Flags, 8, false);
+ DILocalVariable *VarB = DILocalVariable::get(Context, Scope, "B", File, 7,
+ Type, 3, Flags, 8, false);
DebugVariable DebugVariableA(VarA, NoneType(), nullptr);
DebugVariable DebugVariableInlineA(VarA, NoneType(), InlinedLoc);
Index: llvm/unittests/IR/IRBuilderTest.cpp
===================================================================
--- llvm/unittests/IR/IRBuilderTest.cpp
+++ llvm/unittests/IR/IRBuilderTest.cpp
@@ -695,8 +695,8 @@
auto Error = DIB.getOrCreateArray({Int});
auto Err = DIB.createFunction(
CU, "err", "", File, 1, Type, 1, DINode::FlagZero,
- DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized, nullptr,
- nullptr, Error.get());
+ DISubprogram::SPFlagDefinition | DISubprogram::SPFlagOptimized, false,
+ nullptr, nullptr, Error.get());
EXPECT_TRUE(Err->getThrownTypes().get() == Error.get());
DIB.finalize();
}
Index: llvm/unittests/CodeGen/MachineInstrTest.cpp
===================================================================
--- llvm/unittests/CodeGen/MachineInstrTest.cpp
+++ llvm/unittests/CodeGen/MachineInstrTest.cpp
@@ -322,7 +322,7 @@
DIFile *DIF = DIFile::getDistinct(Ctx, "filename", "");
DISubprogram *DIS = DISubprogram::getDistinct(
Ctx, nullptr, "", "", DIF, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero,
- DISubprogram::SPFlagZero, nullptr);
+ DISubprogram::SPFlagZero, false, nullptr);
DILocation *DIL = DILocation::get(Ctx, 1, 5, DIS);
DebugLoc DL(DIL);
MachineInstr *MI = MF->CreateMachineInstr(MCID, DL);
Index: llvm/lib/IR/LLVMContextImpl.h
===================================================================
--- llvm/lib/IR/LLVMContextImpl.h
+++ llvm/lib/IR/LLVMContextImpl.h
@@ -618,6 +618,7 @@
int ThisAdjustment;
unsigned Flags;
unsigned SPFlags;
+ bool isConstexpr;
Metadata *Unit;
Metadata *TemplateParams;
Metadata *Declaration;
@@ -628,15 +629,16 @@
Metadata *File, unsigned Line, Metadata *Type,
unsigned ScopeLine, Metadata *ContainingType,
unsigned VirtualIndex, int ThisAdjustment, unsigned Flags,
- unsigned SPFlags, Metadata *Unit, Metadata *TemplateParams,
- Metadata *Declaration, Metadata *RetainedNodes,
- Metadata *ThrownTypes)
+ unsigned SPFlags, bool isConstexpr, Metadata *Unit,
+ Metadata *TemplateParams, Metadata *Declaration,
+ Metadata *RetainedNodes, Metadata *ThrownTypes)
: Scope(Scope), Name(Name), LinkageName(LinkageName), File(File),
Line(Line), Type(Type), ScopeLine(ScopeLine),
ContainingType(ContainingType), VirtualIndex(VirtualIndex),
ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags),
- Unit(Unit), TemplateParams(TemplateParams), Declaration(Declaration),
- RetainedNodes(RetainedNodes), ThrownTypes(ThrownTypes) {}
+ isConstexpr(isConstexpr), Unit(Unit), TemplateParams(TemplateParams),
+ Declaration(Declaration), RetainedNodes(RetainedNodes),
+ ThrownTypes(ThrownTypes) {}
MDNodeKeyImpl(const DISubprogram *N)
: Scope(N->getRawScope()), Name(N->getRawName()),
LinkageName(N->getRawLinkageName()), File(N->getRawFile()),
@@ -887,17 +889,19 @@
Metadata *StaticDataMemberDeclaration;
Metadata *TemplateParams;
uint32_t AlignInBits;
+ bool isConstant;
MDNodeKeyImpl(Metadata *Scope, MDString *Name, MDString *LinkageName,
Metadata *File, unsigned Line, Metadata *Type,
bool IsLocalToUnit, bool IsDefinition,
Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
- uint32_t AlignInBits)
+ uint32_t AlignInBits, bool isConstant)
: Scope(Scope), Name(Name), LinkageName(LinkageName), File(File),
Line(Line), Type(Type), IsLocalToUnit(IsLocalToUnit),
IsDefinition(IsDefinition),
StaticDataMemberDeclaration(StaticDataMemberDeclaration),
- TemplateParams(TemplateParams), AlignInBits(AlignInBits) {}
+ TemplateParams(TemplateParams), AlignInBits(AlignInBits),
+ isConstant(isConstant) {}
MDNodeKeyImpl(const DIGlobalVariable *N)
: Scope(N->getRawScope()), Name(N->getRawName()),
LinkageName(N->getRawLinkageName()), File(N->getRawFile()),
@@ -905,7 +909,7 @@
IsLocalToUnit(N->isLocalToUnit()), IsDefinition(N->isDefinition()),
StaticDataMemberDeclaration(N->getRawStaticDataMemberDeclaration()),
TemplateParams(N->getRawTemplateParams()),
- AlignInBits(N->getAlignInBits()) {}
+ AlignInBits(N->getAlignInBits()) /*, isConstant(N->isConstant())*/ {}
bool isKeyOf(const DIGlobalVariable *RHS) const {
return Scope == RHS->getRawScope() && Name == RHS->getRawName() &&
@@ -916,7 +920,9 @@
StaticDataMemberDeclaration ==
RHS->getRawStaticDataMemberDeclaration() &&
TemplateParams == RHS->getRawTemplateParams() &&
- AlignInBits == RHS->getAlignInBits();
+ AlignInBits == RHS->getAlignInBits() /*&&
+ isConstant == RHS->isConstant()*/
+ ; /*TODO*/
}
unsigned getHashValue() const {
@@ -942,22 +948,26 @@
unsigned Arg;
unsigned Flags;
uint32_t AlignInBits;
+ bool isConstant;
MDNodeKeyImpl(Metadata *Scope, MDString *Name, Metadata *File, unsigned Line,
Metadata *Type, unsigned Arg, unsigned Flags,
- uint32_t AlignInBits)
+ uint32_t AlignInBits, bool isConstant)
: Scope(Scope), Name(Name), File(File), Line(Line), Type(Type), Arg(Arg),
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()), AlignInBits(N->getAlignInBits()) {}
+ Flags(N->getFlags()),
+ AlignInBits(N->getAlignInBits()) /*, isConstant(N->isConstant())*/ {}
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() && AlignInBits == RHS->getAlignInBits();
+ Flags == RHS->getFlags() && AlignInBits == RHS->getAlignInBits() /*&&
+ isConstant == RHS->isConstant()*/
+ ;
}
unsigned getHashValue() const {
Index: llvm/lib/IR/DebugInfoMetadata.cpp
===================================================================
--- llvm/lib/IR/DebugInfoMetadata.cpp
+++ llvm/lib/IR/DebugInfoMetadata.cpp
@@ -631,16 +631,17 @@
LLVMContext &Context, Metadata *Scope, MDString *Name,
MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
- int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
- Metadata *TemplateParams, Metadata *Declaration, Metadata *RetainedNodes,
- Metadata *ThrownTypes, StorageType Storage, bool ShouldCreate) {
+ int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, bool isConstexpr,
+ Metadata *Unit, Metadata *TemplateParams, Metadata *Declaration,
+ Metadata *RetainedNodes, Metadata *ThrownTypes, StorageType Storage,
+ bool ShouldCreate) {
assert(isCanonical(Name) && "Expected canonical MDString");
assert(isCanonical(LinkageName) && "Expected canonical MDString");
DEFINE_GETIMPL_LOOKUP(DISubprogram,
(Scope, Name, LinkageName, File, Line, Type, ScopeLine,
ContainingType, VirtualIndex, ThisAdjustment, Flags,
- SPFlags, Unit, TemplateParams, Declaration,
- RetainedNodes, ThrownTypes));
+ SPFlags, isConstexpr, Unit, TemplateParams,
+ Declaration, RetainedNodes, ThrownTypes));
SmallVector<Metadata *, 11> Ops = {
File, Scope, Name, LinkageName, Type, Unit,
Declaration, RetainedNodes, ContainingType, TemplateParams, ThrownTypes};
@@ -652,10 +653,10 @@
Ops.pop_back();
}
}
- DEFINE_GETIMPL_STORE_N(
- DISubprogram,
- (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags, SPFlags), Ops,
- Ops.size());
+ DEFINE_GETIMPL_STORE_N(DISubprogram,
+ (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags,
+ SPFlags, isConstexpr),
+ Ops, Ops.size());
}
bool DISubprogram::describes(const Function *F) const {
@@ -750,13 +751,14 @@
Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
Metadata *StaticDataMemberDeclaration,
Metadata *TemplateParams, uint32_t AlignInBits,
- StorageType Storage, bool ShouldCreate) {
+ bool isConstant, 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,
- StaticDataMemberDeclaration,
- TemplateParams, AlignInBits));
+ DEFINE_GETIMPL_LOOKUP(
+ DIGlobalVariable,
+ (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, TemplateParams, AlignInBits, isConstant));
Metadata *Ops[] = {Scope,
Name,
File,
@@ -765,15 +767,16 @@
LinkageName,
StaticDataMemberDeclaration,
TemplateParams};
- DEFINE_GETIMPL_STORE(DIGlobalVariable,
- (Line, IsLocalToUnit, IsDefinition, AlignInBits), Ops);
+ DEFINE_GETIMPL_STORE(
+ DIGlobalVariable,
+ (Line, IsLocalToUnit, IsDefinition, AlignInBits, isConstant), Ops);
}
DILocalVariable *DILocalVariable::getImpl(LLVMContext &Context, Metadata *Scope,
MDString *Name, Metadata *File,
unsigned Line, Metadata *Type,
unsigned Arg, DIFlags Flags,
- uint32_t AlignInBits,
+ uint32_t AlignInBits, bool isConstant,
StorageType Storage,
bool ShouldCreate) {
// 64K ought to be enough for any frontend.
@@ -781,11 +784,11 @@
assert(Scope && "Expected scope");
assert(isCanonical(Name) && "Expected canonical MDString");
- DEFINE_GETIMPL_LOOKUP(DILocalVariable,
- (Scope, Name, File, Line, Type, Arg, Flags,
- AlignInBits));
+ DEFINE_GETIMPL_LOOKUP(DILocalVariable, (Scope, Name, File, Line, Type, Arg,
+ Flags, AlignInBits, isConstant));
Metadata *Ops[] = {Scope, Name, File, Type};
- DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags, AlignInBits), Ops);
+ DEFINE_GETIMPL_STORE(DILocalVariable,
+ (Line, Arg, Flags, AlignInBits, isConstant), Ops);
}
Optional<uint64_t> DIVariable::getSizeInBits() const {
Index: llvm/lib/IR/DebugInfo.cpp
===================================================================
--- llvm/lib/IR/DebugInfo.cpp
+++ llvm/lib/IR/DebugInfo.cpp
@@ -465,8 +465,8 @@
MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
- MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
- Variables);
+ MDS->getFlags(), MDS->getSPFlags(), false, /*todo*/ Unit,
+ TemplateParams, Declaration, Variables);
};
if (MDS->isDistinct())
@@ -476,7 +476,8 @@
MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
- MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
+ MDS->getSPFlags(), false /*todo*/, Unit, TemplateParams, Declaration,
+ Variables);
StringRef OldLinkageName = MDS->getLinkageName();
@@ -832,8 +833,8 @@
unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
map_from_llvmDIFlags(Flags),
- pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
- nullptr, nullptr));
+ pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized),
+ false /*todo*/, nullptr, nullptr, nullptr));
}
Index: llvm/lib/IR/DIBuilder.cpp
===================================================================
--- llvm/lib/IR/DIBuilder.cpp
+++ llvm/lib/IR/DIBuilder.cpp
@@ -641,15 +641,16 @@
DIGlobalVariableExpression *DIBuilder::createGlobalVariableExpression(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
- unsigned LineNumber, DIType *Ty, bool IsLocalToUnit,
- bool isDefined, DIExpression *Expr,
- MDNode *Decl, MDTuple *TemplateParams, uint32_t AlignInBits) {
+ unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, bool isDefined,
+ DIExpression *Expr, MDNode *Decl, MDTuple *TemplateParams,
+ uint32_t AlignInBits, bool isConstant) {
checkGlobalVariableScope(Context);
auto *GV = DIGlobalVariable::getDistinct(
VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
- LineNumber, Ty, IsLocalToUnit, isDefined, cast_or_null<DIDerivedType>(Decl),
- TemplateParams, AlignInBits);
+ LineNumber, Ty, IsLocalToUnit, isDefined,
+ cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits,
+ isConstant);
if (!Expr)
Expr = createExpression();
auto *N = DIGlobalVariableExpression::get(VMContext, GV, Expr);
@@ -660,13 +661,14 @@
DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, MDNode *Decl,
- MDTuple *TemplateParams, uint32_t AlignInBits) {
+ MDTuple *TemplateParams, uint32_t AlignInBits, bool isConstant) {
checkGlobalVariableScope(Context);
return DIGlobalVariable::getTemporary(
VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
LineNumber, Ty, IsLocalToUnit, false,
- cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits)
+ cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits,
+ isConstant)
.release();
}
@@ -675,16 +677,16 @@
DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>> &PreservedVariables,
DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
- uint32_t AlignInBits) {
+ uint32_t AlignInBits, bool isConstant) {
// FIXME: Why getNonCompileUnitScope()?
// FIXME: Why is "!Context" okay here?
// FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT
// the only valid scopes)?
DIScope *Context = getNonCompileUnitScope(Scope);
- auto *Node =
- DILocalVariable::get(VMContext, cast_or_null<DILocalScope>(Context), Name,
- File, LineNo, Ty, ArgNo, Flags, AlignInBits);
+ auto *Node = DILocalVariable::get(
+ VMContext, cast_or_null<DILocalScope>(Context), Name, File, LineNo, Ty,
+ ArgNo, Flags, AlignInBits, isConstant);
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
@@ -700,10 +702,11 @@
DIFile *File, unsigned LineNo,
DIType *Ty, bool AlwaysPreserve,
DINode::DIFlags Flags,
- uint32_t AlignInBits) {
+ uint32_t AlignInBits,
+ bool isConstant) {
return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
/* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve,
- Flags, AlignInBits);
+ Flags, AlignInBits, isConstant);
}
DILocalVariable *DIBuilder::createParameterVariable(
@@ -712,7 +715,7 @@
assert(ArgNo && "Expected non-zero argument number for parameter");
return createLocalVariable(VMContext, PreservedVariables, Scope, Name, ArgNo,
File, LineNo, Ty, AlwaysPreserve, Flags,
- /* AlignInBits */0);
+ /* AlignInBits */ 0, /* constexpr */ false);
}
DILabel *DIBuilder::createLabel(
@@ -755,14 +758,14 @@
DISubprogram *DIBuilder::createFunction(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
- DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
+ DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags, bool isConstexpr,
DITemplateParameterArray TParams, DISubprogram *Decl,
DITypeArray ThrownTypes) {
bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
auto *Node = getSubprogram(
/*IsDistinct=*/IsDefinition, VMContext, getNonCompileUnitScope(Context),
Name, LinkageName, File, LineNo, Ty, ScopeLine, nullptr, 0, 0, Flags,
- SPFlags, IsDefinition ? CUNode : nullptr, TParams, Decl,
+ SPFlags, isConstexpr, IsDefinition ? CUNode : nullptr, TParams, Decl,
MDTuple::getTemporary(VMContext, None).release(), ThrownTypes);
if (IsDefinition)
@@ -774,15 +777,15 @@
DISubprogram *DIBuilder::createTempFunctionFwdDecl(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
- DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
+ DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags, bool isConstexpr,
DITemplateParameterArray TParams, DISubprogram *Decl,
DITypeArray ThrownTypes) {
bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
- return DISubprogram::getTemporary(VMContext, getNonCompileUnitScope(Context),
- Name, LinkageName, File, LineNo, Ty,
- ScopeLine, nullptr, 0, 0, Flags, SPFlags,
- IsDefinition ? CUNode : nullptr, TParams,
- Decl, nullptr, ThrownTypes)
+ return DISubprogram::getTemporary(
+ VMContext, getNonCompileUnitScope(Context), Name, LinkageName,
+ File, LineNo, Ty, ScopeLine, nullptr, 0, 0, Flags, SPFlags,
+ isConstexpr, IsDefinition ? CUNode : nullptr, TParams, Decl,
+ nullptr, ThrownTypes)
.release();
}
@@ -790,8 +793,8 @@
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
unsigned LineNo, DISubroutineType *Ty, unsigned VIndex, int ThisAdjustment,
DIType *VTableHolder, DINode::DIFlags Flags,
- DISubprogram::DISPFlags SPFlags, DITemplateParameterArray TParams,
- DITypeArray ThrownTypes) {
+ DISubprogram::DISPFlags SPFlags, bool isConstexpr,
+ DITemplateParameterArray TParams, DITypeArray ThrownTypes) {
assert(getNonCompileUnitScope(Context) &&
"Methods should have both a Context and a context that isn't "
"the compile unit.");
@@ -800,8 +803,8 @@
auto *SP = getSubprogram(
/*IsDistinct=*/IsDefinition, VMContext, cast<DIScope>(Context), Name,
LinkageName, F, LineNo, Ty, LineNo, VTableHolder, VIndex, ThisAdjustment,
- Flags, SPFlags, IsDefinition ? CUNode : nullptr, TParams, nullptr,
- nullptr, ThrownTypes);
+ Flags, SPFlags, isConstexpr, IsDefinition ? CUNode : nullptr, TParams,
+ nullptr, nullptr, ThrownTypes);
if (IsDefinition)
AllSubprograms.push_back(SP);
Index: llvm/lib/IR/AsmWriter.cpp
===================================================================
--- llvm/lib/IR/AsmWriter.cpp
+++ llvm/lib/IR/AsmWriter.cpp
@@ -1968,6 +1968,8 @@
Printer.printInt("thisAdjustment", N->getThisAdjustment());
Printer.printDIFlags("flags", N->getFlags());
Printer.printDISPFlags("spFlags", N->getSPFlags());
+ if (Context->getDwarfVersion() >= 5)
+ Printer.printBool("const_expr", N->isConstexpr());
Printer.printMetadata("unit", N->getRawUnit());
Printer.printMetadata("templateParams", N->getRawTemplateParams());
Printer.printMetadata("declaration", N->getRawDeclaration());
@@ -2105,6 +2107,8 @@
Printer.printMetadata("declaration", N->getRawStaticDataMemberDeclaration());
Printer.printMetadata("templateParams", N->getRawTemplateParams());
Printer.printInt("align", N->getAlignInBits());
+ if (Context->getDwarfVersion() >= 5)
+ Printer.printBool("const_expr", N->isConstant());
Out << ")";
}
@@ -2121,6 +2125,8 @@
Printer.printMetadata("type", N->getRawType());
Printer.printDIFlags("flags", N->getFlags());
Printer.printInt("align", N->getAlignInBits());
+ if (Context->getDwarfVersion() >= 5)
+ Printer.printBool("const_expr", N->isConstant());
Out << ")";
}
Index: llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -179,6 +179,9 @@
// Add location.
addLocationAttribute(VariableDIE, GV, GlobalExprs);
+ if (GV->isConstant())
+ addFlag(*VariableDIE, dwarf::DW_AT_const_expr);
+
return VariableDIE;
}
@@ -432,6 +435,8 @@
}
}
+ if (SP->isConstexpr())
+ addFlag(*SPDie, dwarf::DW_AT_const_expr);
// Add name to the name table, we do this here because we're guaranteed
// to have concrete versions of our DW_TAG_subprogram nodes.
DD->addSubprogramNames(*CUNode, SP, *SPDie);
@@ -717,6 +722,8 @@
NVPTXAddressSpace ? *NVPTXAddressSpace : NVPTX_ADDR_local_space);
}
addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
+ if (DV.getVariable()->isConstant())
+ addFlag(*VariableDie, dwarf::DW_AT_const_expr);
if (DwarfExpr.TagOffset)
addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
*DwarfExpr.TagOffset);
Index: llvm/lib/Bitcode/Reader/MetadataLoader.cpp
===================================================================
--- llvm/lib/Bitcode/Reader/MetadataLoader.cpp
+++ llvm/lib/Bitcode/Reader/MetadataLoader.cpp
@@ -1549,24 +1549,25 @@
DISubprogram *SP = GET_OR_DISTINCT(
DISubprogram,
(Context,
- getDITypeRefOrNull(Record[1]), // scope
- getMDString(Record[2]), // name
- getMDString(Record[3]), // linkageName
- getMDOrNull(Record[4]), // file
- Record[5], // line
- getMDOrNull(Record[6]), // type
- Record[7 + OffsetA], // scopeLine
- getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
- Record[10 + OffsetA], // virtualIndex
- HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
- Flags, // flags
- SPFlags, // SPFlags
- HasUnit ? CUorFn : nullptr, // unit
- getMDOrNull(Record[13 + OffsetB]), // templateParams
- getMDOrNull(Record[14 + OffsetB]), // declaration
- getMDOrNull(Record[15 + OffsetB]), // retainedNodes
+ getDITypeRefOrNull(Record[1]), // scope
+ getMDString(Record[2]), // name
+ getMDString(Record[3]), // linkageName
+ getMDOrNull(Record[4]), // file
+ Record[5], // line
+ getMDOrNull(Record[6]), // type
+ Record[7 + OffsetA], // scopeLine
+ getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
+ Record[10 + OffsetA], // virtualIndex
+ HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
+ Flags, // flags
+ SPFlags, // SPFlags
+ false,
+ HasUnit ? CUorFn : nullptr, // unit
+ getMDOrNull(Record[13 + OffsetB]), // templateParams
+ getMDOrNull(Record[14 + OffsetB]), // declaration
+ getMDOrNull(Record[15 + OffsetB]), // retainedNodes
HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
- : nullptr // thrownTypes
+ : nullptr // thrownTypes
));
MetadataList.assignValue(SP, NextMetadataNo);
NextMetadataNo++;
@@ -1702,12 +1703,13 @@
if (Version == 2) {
MetadataList.assignValue(
- GET_OR_DISTINCT(
- DIGlobalVariable,
- (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
- getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
- getDITypeRefOrNull(Record[6]), Record[7], Record[8],
- getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])),
+ GET_OR_DISTINCT(DIGlobalVariable,
+ (Context, getMDOrNull(Record[1]),
+ getMDString(Record[2]), getMDString(Record[3]),
+ getMDOrNull(Record[4]), Record[5],
+ getDITypeRefOrNull(Record[6]), Record[7], Record[8],
+ getMDOrNull(Record[9]), getMDOrNull(Record[10]),
+ Record[11], false)),
NextMetadataNo);
NextMetadataNo++;
@@ -1715,12 +1717,12 @@
// No upgrade necessary. A null field will be introduced to indicate
// that no parameter information is available.
MetadataList.assignValue(
- GET_OR_DISTINCT(DIGlobalVariable,
- (Context, getMDOrNull(Record[1]),
- getMDString(Record[2]), getMDString(Record[3]),
- getMDOrNull(Record[4]), Record[5],
- getDITypeRefOrNull(Record[6]), Record[7], Record[8],
- getMDOrNull(Record[10]), nullptr, Record[11])),
+ GET_OR_DISTINCT(
+ DIGlobalVariable,
+ (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
+ getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
+ getDITypeRefOrNull(Record[6]), Record[7], Record[8],
+ getMDOrNull(Record[10]), nullptr, Record[11], false)),
NextMetadataNo);
NextMetadataNo++;
@@ -1753,7 +1755,7 @@
(Context, getMDOrNull(Record[1]), getMDString(Record[2]),
getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
getDITypeRefOrNull(Record[6]), Record[7], Record[8],
- getMDOrNull(Record[10]), nullptr, AlignInBits));
+ getMDOrNull(Record[10]), nullptr, AlignInBits, false));
DIGlobalVariableExpression *DGVE = nullptr;
if (Attach || Expr)
@@ -1794,7 +1796,8 @@
getMDString(Record[2 + HasTag]),
getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
getDITypeRefOrNull(Record[5 + HasTag]),
- Record[6 + HasTag], Flags, AlignInBits)),
+ Record[6 + HasTag], Flags, AlignInBits,
+ false /*Record[9 + HasTag]*/)),
NextMetadataNo);
NextMetadataNo++;
break;
Index: llvm/lib/AsmParser/LLParser.cpp
===================================================================
--- llvm/lib/AsmParser/LLParser.cpp
+++ llvm/lib/AsmParser/LLParser.cpp
@@ -4697,6 +4697,7 @@
OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
OPTIONAL(flags, DIFlagField, ); \
OPTIONAL(spFlags, DISPFlagField, ); \
+ OPTIONAL(const_expr, MDBoolField, ); \
OPTIONAL(isOptimized, MDBoolField, ); \
OPTIONAL(unit, MDField, ); \
OPTIONAL(templateParams, MDField, ); \
@@ -4717,11 +4718,11 @@
Loc,
"missing 'distinct', required for !DISubprogram that is a Definition");
Result = GET_OR_DISTINCT(
- DISubprogram,
- (Context, scope.Val, name.Val, linkageName.Val, file.Val, line.Val,
- type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
- thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
- declaration.Val, retainedNodes.Val, thrownTypes.Val));
+ DISubprogram, (Context, scope.Val, name.Val, linkageName.Val, file.Val,
+ line.Val, type.Val, scopeLine.Val, containingType.Val,
+ virtualIndex.Val, thisAdjustment.Val, flags.Val, SPFlags,
+ const_expr.Val, unit.Val, templateParams.Val,
+ declaration.Val, retainedNodes.Val, thrownTypes.Val));
return false;
}
@@ -4886,15 +4887,16 @@
OPTIONAL(isDefinition, MDBoolField, (true)); \
OPTIONAL(templateParams, MDField, ); \
OPTIONAL(declaration, MDField, ); \
- OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));
+ OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
+ OPTIONAL(const_expr, MDBoolField, );
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,
- declaration.Val, templateParams.Val, align.Val));
+ Result = GET_OR_DISTINCT(DIGlobalVariable,
+ (Context, scope.Val, name.Val, linkageName.Val,
+ file.Val, line.Val, type.Val, isLocal.Val,
+ isDefinition.Val, declaration.Val,
+ templateParams.Val, align.Val, const_expr.Val));
return false;
}
@@ -4914,13 +4916,15 @@
OPTIONAL(line, LineField, ); \
OPTIONAL(type, MDField, ); \
OPTIONAL(flags, DIFlagField, ); \
- OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX));
+ OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
+ OPTIONAL(const_expr, MDBoolField, );
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, align.Val));
+ Result =
+ GET_OR_DISTINCT(DILocalVariable, (Context, scope.Val, name.Val, file.Val,
+ line.Val, type.Val, arg.Val, flags.Val,
+ align.Val, const_expr.Val));
return false;
}
Index: llvm/include/llvm/IR/DebugInfoMetadata.h
===================================================================
--- llvm/include/llvm/IR/DebugInfoMetadata.h
+++ llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -1646,14 +1646,17 @@
private:
DIFlags Flags;
DISPFlags SPFlags;
+ bool Constexpr;
DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
- DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops)
+ DIFlags Flags, DISPFlags SPFlags, bool Constexpr,
+ ArrayRef<Metadata *> Ops)
: DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram,
Ops),
Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
- ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
+ ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags),
+ Constexpr(Constexpr) {
static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range");
}
~DISubprogram() = default;
@@ -1663,32 +1666,32 @@
StringRef LinkageName, DIFile *File, unsigned Line,
DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType,
unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
- DISPFlags SPFlags, DICompileUnit *Unit,
+ DISPFlags SPFlags, bool isConstexpr, DICompileUnit *Unit,
DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
DINodeArray RetainedNodes, DITypeArray ThrownTypes,
StorageType Storage, bool ShouldCreate = true) {
return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
getCanonicalMDString(Context, LinkageName), File, Line, Type,
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
- Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
- RetainedNodes.get(), ThrownTypes.get(), Storage,
+ Flags, SPFlags, isConstexpr, Unit, TemplateParams.get(),
+ Declaration, RetainedNodes.get(), ThrownTypes.get(), Storage,
ShouldCreate);
}
- static DISubprogram *getImpl(LLVMContext &Context, Metadata *Scope,
- MDString *Name, MDString *LinkageName,
- Metadata *File, unsigned Line, Metadata *Type,
- unsigned ScopeLine, Metadata *ContainingType,
- unsigned VirtualIndex, int ThisAdjustment,
- DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
- Metadata *TemplateParams, Metadata *Declaration,
- Metadata *RetainedNodes, Metadata *ThrownTypes,
- StorageType Storage, bool ShouldCreate = true);
+ static DISubprogram *
+ getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
+ MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
+ unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
+ int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
+ bool isConstexpr, Metadata *Unit, Metadata *TemplateParams,
+ Metadata *Declaration, Metadata *RetainedNodes, Metadata *ThrownTypes,
+ StorageType Storage, bool ShouldCreate = true);
TempDISubprogram cloneImpl() const {
return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
getFile(), getLine(), getType(), getScopeLine(),
getContainingType(), getVirtualIndex(),
getThisAdjustment(), getFlags(), getSPFlags(),
+ false, /*todo*/
getUnit(), getTemplateParams(), getDeclaration(),
getRetainedNodes(), getThrownTypes());
}
@@ -1699,25 +1702,25 @@
(DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
- DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
+ DIFlags Flags, DISPFlags SPFlags, bool isConstexpr, DICompileUnit *Unit,
DITemplateParameterArray TemplateParams = nullptr,
DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
DITypeArray ThrownTypes = nullptr),
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
- VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
- Declaration, RetainedNodes, ThrownTypes))
+ VirtualIndex, ThisAdjustment, Flags, SPFlags, isConstexpr, Unit,
+ TemplateParams, Declaration, RetainedNodes, ThrownTypes))
DEFINE_MDNODE_GET(
DISubprogram,
(Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
unsigned Line, Metadata *Type, unsigned ScopeLine,
Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
- DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
+ DIFlags Flags, DISPFlags SPFlags, bool isConstexpr, Metadata *Unit,
Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr,
Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr),
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
- VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
- Declaration, RetainedNodes, ThrownTypes))
+ VirtualIndex, ThisAdjustment, Flags, SPFlags, isConstexpr, Unit,
+ TemplateParams, Declaration, RetainedNodes, ThrownTypes))
TempDISubprogram clone() const { return cloneImpl(); }
@@ -1730,6 +1733,7 @@
public:
unsigned getLine() const { return Line; }
+ bool isConstexpr() const { return Constexpr; }
unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
unsigned getVirtualIndex() const { return VirtualIndex; }
int getThisAdjustment() const { return ThisAdjustment; }
@@ -2235,12 +2239,14 @@
class DIVariable : public DINode {
unsigned Line;
uint32_t AlignInBits;
+ bool ConstExpr;
protected:
DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Line,
- ArrayRef<Metadata *> Ops, uint32_t AlignInBits = 0)
+ ArrayRef<Metadata *> Ops, uint32_t AlignInBits = 0,
+ bool ConstExpr = false)
: DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line),
- AlignInBits(AlignInBits) {}
+ AlignInBits(AlignInBits), ConstExpr(ConstExpr) {}
~DIVariable() = default;
public:
@@ -2284,6 +2290,7 @@
MDString *getRawName() const { return getOperandAs<MDString>(1); }
Metadata *getRawFile() const { return getOperand(2); }
Metadata *getRawType() const { return getOperand(3); }
+ bool isConstant() const { return ConstExpr; }
static bool classof(const Metadata *MD) {
return MD->getMetadataID() == DILocalVariableKind ||
@@ -2625,8 +2632,9 @@
DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits,
- ArrayRef<Metadata *> Ops)
- : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
+ bool IsConstant, ArrayRef<Metadata *> Ops)
+ : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits,
+ IsConstant),
IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
~DIGlobalVariable() = default;
@@ -2635,46 +2643,46 @@
StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type,
bool IsLocalToUnit, bool IsDefinition,
DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams,
- uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true) {
+ uint32_t AlignInBits, bool IsConstant, StorageType Storage,
+ bool ShouldCreate = true) {
return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
getCanonicalMDString(Context, LinkageName), File, Line, Type,
IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration,
- cast_or_null<Metadata>(TemplateParams), AlignInBits, Storage,
- ShouldCreate);
+ cast_or_null<Metadata>(TemplateParams), AlignInBits,
+ IsConstant, Storage, ShouldCreate);
}
static DIGlobalVariable *
getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
bool IsLocalToUnit, bool IsDefinition,
Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
- uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true);
+ uint32_t AlignInBits, bool IsConstant, StorageType Storage,
+ bool ShouldCreate = true);
TempDIGlobalVariable cloneImpl() const {
return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
getFile(), getLine(), getType(), isLocalToUnit(),
isDefinition(), getStaticDataMemberDeclaration(),
- getTemplateParams(), getAlignInBits());
+ getTemplateParams(), getAlignInBits(), false /*TODO*/);
}
public:
- DEFINE_MDNODE_GET(DIGlobalVariable,
- (DIScope * Scope, StringRef Name, StringRef LinkageName,
- DIFile *File, unsigned Line, DIType *Type,
- bool IsLocalToUnit, bool IsDefinition,
- DIDerivedType *StaticDataMemberDeclaration,
- MDTuple *TemplateParams, uint32_t AlignInBits),
- (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, StaticDataMemberDeclaration, TemplateParams,
- AlignInBits))
- DEFINE_MDNODE_GET(DIGlobalVariable,
- (Metadata * Scope, MDString *Name, MDString *LinkageName,
- Metadata *File, unsigned Line, Metadata *Type,
- bool IsLocalToUnit, bool IsDefinition,
- Metadata *StaticDataMemberDeclaration,
- Metadata *TemplateParams, uint32_t AlignInBits),
- (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, StaticDataMemberDeclaration, TemplateParams,
- AlignInBits))
+ DEFINE_MDNODE_GET(
+ DIGlobalVariable,
+ (DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
+ unsigned Line, DIType *Type, bool IsLocalToUnit, bool IsDefinition,
+ DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams,
+ uint32_t AlignInBits, bool IsConstant),
+ (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, TemplateParams, AlignInBits, IsConstant))
+ DEFINE_MDNODE_GET(
+ DIGlobalVariable,
+ (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
+ unsigned Line, Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
+ Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
+ uint32_t AlignInBits, bool IsConstant),
+ (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
+ StaticDataMemberDeclaration, TemplateParams, AlignInBits, IsConstant))
TempDIGlobalVariable clone() const { return cloneImpl(); }
@@ -2767,8 +2775,9 @@
DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
- ArrayRef<Metadata *> Ops)
- : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
+ bool IsConstant, ArrayRef<Metadata *> Ops)
+ : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits,
+ IsConstant),
Arg(Arg), Flags(Flags) {
assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
}
@@ -2777,34 +2786,39 @@
static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
StringRef Name, DIFile *File, unsigned Line,
DIType *Type, unsigned Arg, DIFlags Flags,
- uint32_t AlignInBits, StorageType Storage,
+ uint32_t AlignInBits, bool IsConstant,
+ StorageType Storage,
bool ShouldCreate = true) {
return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
- Line, Type, Arg, Flags, AlignInBits, Storage, ShouldCreate);
+ Line, Type, Arg, Flags, AlignInBits, IsConstant, Storage,
+ ShouldCreate);
}
static DILocalVariable *getImpl(LLVMContext &Context, Metadata *Scope,
MDString *Name, Metadata *File, unsigned Line,
Metadata *Type, unsigned Arg, DIFlags Flags,
- uint32_t AlignInBits, StorageType Storage,
+ uint32_t AlignInBits, bool IsConstant,
+ StorageType Storage,
bool ShouldCreate = true);
TempDILocalVariable cloneImpl() const {
return getTemporary(getContext(), getScope(), getName(), getFile(),
getLine(), getType(), getArg(), getFlags(),
- getAlignInBits());
+ getAlignInBits(), isConstant());
}
public:
DEFINE_MDNODE_GET(DILocalVariable,
(DILocalScope * Scope, StringRef Name, DIFile *File,
unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags,
- uint32_t AlignInBits),
- (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
+ uint32_t AlignInBits, bool IsConstant),
+ (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
+ IsConstant))
DEFINE_MDNODE_GET(DILocalVariable,
(Metadata * Scope, MDString *Name, Metadata *File,
- unsigned Line, Metadata *Type, unsigned Arg,
- DIFlags Flags, uint32_t AlignInBits),
- (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
+ unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
+ uint32_t AlignInBits, bool IsConstant),
+ (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
+ IsConstant))
TempDILocalVariable clone() const { return cloneImpl(); }
Index: llvm/include/llvm/IR/DIBuilder.h
===================================================================
--- llvm/include/llvm/IR/DIBuilder.h
+++ llvm/include/llvm/IR/DIBuilder.h
@@ -582,18 +582,22 @@
/// \param Decl Reference to the corresponding declaration.
/// \param AlignInBits Variable alignment(or 0 if no alignment attr was
/// specified)
+ /// \isConstExpr Boolean flag indicating wheather this variable is
+ /// constexpr or not
DIGlobalVariableExpression *createGlobalVariableExpression(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned LineNo, DIType *Ty, bool IsLocalToUnit, bool isDefined = true,
DIExpression *Expr = nullptr, MDNode *Decl = nullptr,
- MDTuple *TemplateParams = nullptr, uint32_t AlignInBits = 0);
+ MDTuple *TemplateParams = nullptr, uint32_t AlignInBits = 0,
+ bool isConstExpr = false);
/// 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, MDNode *Decl = nullptr,
- MDTuple *TemplateParams= nullptr, uint32_t AlignInBits = 0);
+ MDTuple *TemplateParams = nullptr, uint32_t AlignInBits = 0,
+ bool isConstExpr = false);
/// Create a new descriptor for an auto variable. This is a local variable
/// that is not a subprogram parameter.
@@ -607,7 +611,7 @@
createAutoVariable(DIScope *Scope, StringRef Name, DIFile *File,
unsigned LineNo, DIType *Ty, bool AlwaysPreserve = false,
DINode::DIFlags Flags = DINode::FlagZero,
- uint32_t AlignInBits = 0);
+ uint32_t AlignInBits = 0, bool isConstExpr = false);
/// Create a new descriptor for an label.
///
@@ -661,14 +665,13 @@
/// \param SPFlags Additional flags specific to subprograms.
/// \param TParams Function template parameters.
/// \param ThrownTypes Exception types this function may throw.
- DISubprogram *
- createFunction(DIScope *Scope, StringRef Name, StringRef LinkageName,
- DIFile *File, unsigned LineNo, DISubroutineType *Ty,
- unsigned ScopeLine, DINode::DIFlags Flags = DINode::FlagZero,
- DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
- DITemplateParameterArray TParams = nullptr,
- DISubprogram *Decl = nullptr,
- DITypeArray ThrownTypes = nullptr);
+ DISubprogram *createFunction(
+ DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File,
+ unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
+ DINode::DIFlags Flags = DINode::FlagZero,
+ DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
+ bool constExpr = false, DITemplateParameterArray TParams = nullptr,
+ DISubprogram *Decl = nullptr, DITypeArray ThrownTypes = nullptr);
/// Identical to createFunction,
/// except that the resulting DbgNode is meant to be RAUWed.
@@ -677,7 +680,7 @@
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
DINode::DIFlags Flags = DINode::FlagZero,
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
- DITemplateParameterArray TParams = nullptr,
+ bool isConstExpr = false, DITemplateParameterArray TParams = nullptr,
DISubprogram *Decl = nullptr, DITypeArray ThrownTypes = nullptr);
/// Create a new descriptor for the specified C++ method.
@@ -699,15 +702,14 @@
/// \param SPFlags Additional flags specific to subprograms.
/// \param TParams Function template parameters.
/// \param ThrownTypes Exception types this function may throw.
- DISubprogram *
- createMethod(DIScope *Scope, StringRef Name, StringRef LinkageName,
- DIFile *File, unsigned LineNo, DISubroutineType *Ty,
- unsigned VTableIndex = 0, int ThisAdjustment = 0,
- DIType *VTableHolder = nullptr,
- DINode::DIFlags Flags = DINode::FlagZero,
- DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
- DITemplateParameterArray TParams = nullptr,
- DITypeArray ThrownTypes = nullptr);
+ DISubprogram *createMethod(
+ DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File,
+ unsigned LineNo, DISubroutineType *Ty, unsigned VTableIndex = 0,
+ int ThisAdjustment = 0, DIType *VTableHolder = nullptr,
+ DINode::DIFlags Flags = DINode::FlagZero,
+ DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
+ bool isConstExpr = false, DITemplateParameterArray TParams = nullptr,
+ DITypeArray ThrownTypes = nullptr);
/// Create common block entry for a Fortran common block.
/// \param Scope Scope of this common block.
Index: clang/test/CodeGenCXX/dbg-info-all-calls-described.cpp
===================================================================
--- clang/test/CodeGenCXX/dbg-info-all-calls-described.cpp
+++ clang/test/CodeGenCXX/dbg-info-all-calls-described.cpp
@@ -58,7 +58,7 @@
// HAS-ATTR-DAG: DISubprogram(name: "declaration1", {{.*}}, flags: DIFlagPrototyped
// HAS-ATTR-DAG: DISubprogram(name: "declaration2", {{.*}}, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition
-// HAS-ATTR-DAG: DISubprogram(name: "struct1", {{.*}}, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized)
+// HAS-ATTR-DAG: DISubprogram(name: "struct1", {{.*}}, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized
// HAS-ATTR-DAG: DISubprogram(name: "struct1", {{.*}}, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition
// HAS-ATTR-DAG: DISubprogram(name: "method1", {{.*}}, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition
// HAS-ATTR-DAG: DISubprogram(name: "force_irgen", {{.*}}, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition
Index: clang/test/CodeGenCXX/constExpr.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenCXX/constExpr.cpp
@@ -0,0 +1,22 @@
+// Test for DebugInfo for constexpr for C++ variables
+//
+// RUN: %clang_cc1 -dwarf-version=5 -emit-llvm -triple x86_64-linux-gnu %s -o - \
+// RUN: -O0 -disable-llvm-passes \
+// RUN: -debug-info-kind=standalone \
+// RUN: | FileCheck %s
+//
+// CHECK: DIGlobalVariable(name: "bar", {{.*}} const_expr: true)
+// CHECK: DISubprogram(name: "main", {{.*}} const_expr: false{{.*}}
+// CHECK: DILocalVariable(name: "baz", {{.*}} const_expr: true)
+// CHECK: DISubprogram(name: "fun", {{.*}} const_expr: true{{.*}}
+
+constexpr int bar = 10;
+
+constexpr int fun(int x) { return x * 2; }
+
+int main(int argc, char **argv) {
+ int foo = bar;
+ constexpr int baz = 10;
+ int constVal = fun(10);
+ return 0;
+}
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -3397,13 +3397,13 @@
return DBuilder.createFunction(
DContext, Name, LinkageName, Unit, Line,
getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
- TParamsArray.get(), getFunctionDeclaration(FD));
+ FD->isConstexpr(), TParamsArray.get(), getFunctionDeclaration(FD));
}
llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
DContext, Name, LinkageName, Unit, Line,
getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
- TParamsArray.get(), getFunctionDeclaration(FD));
+ false, TParamsArray.get(), getFunctionDeclaration(FD));
const FunctionDecl *CanonDecl = FD->getCanonicalDecl();
FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
std::make_tuple(CanonDecl),
@@ -3434,7 +3434,8 @@
auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
auto *GV = DBuilder.createTempGlobalVariableFwdDecl(
DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
- !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
+ !VD->isExternallyVisible(), nullptr, TemplateParameters, Align,
+ VD->isConstexpr());
FwdDeclReplaceMap.emplace_back(
std::piecewise_construct,
std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
@@ -3694,9 +3695,13 @@
// FunctionDecls. When/if we fix this we can have FDContext be TheCU/null for
// all subprograms instead of the actual context since subprogram definitions
// are emitted as CU level entities by the backend.
+
+ auto *FD = dyn_cast_or_null<FunctionDecl>(GD.getDecl());
+
llvm::DISubprogram *SP = DBuilder.createFunction(
FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine,
- FlagsForDef, SPFlagsForDef, TParamsArray.get(), Decl);
+ FlagsForDef, SPFlagsForDef, FD ? FD->isConstexpr() : false,
+ TParamsArray.get(), Decl);
Fn->setSubprogram(SP);
// We might get here with a VarDecl in the case we're generating
// code for the initialization of globals. Do not record these decls
@@ -3759,11 +3764,12 @@
llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
if (CGM.getLangOpts().Optimize)
SPFlags |= llvm::DISubprogram::SPFlagOptimized;
-
+ auto *FD = dyn_cast_or_null<FunctionDecl>(GD.getDecl());
llvm::DISubprogram *SP = DBuilder.createFunction(
FDContext, Name, LinkageName, Unit, LineNo,
getOrCreateFunctionType(D, FnType, Unit), ScopeLine, Flags, SPFlags,
- TParamsArray.get(), getFunctionDeclaration(D));
+ FD ? FD->isConstexpr() : false, TParamsArray.get(),
+ getFunctionDeclaration(D));
if (IsDeclForCallSite)
Fn->setSubprogram(SP);
@@ -4073,7 +4079,6 @@
auto *D = DBuilder.createAutoVariable(
Scope, FieldName, Unit, Line, FieldTy, CGM.getLangOpts().Optimize,
Flags | llvm::DINode::FlagArtificial, FieldAlign);
-
// Insert an llvm.dbg.declare into the current block.
DBuilder.insertDeclare(
Storage, D, DBuilder.createExpression(Expr),
@@ -4094,12 +4099,13 @@
}
// Create the descriptor for the variable.
- auto *D = ArgNo ? DBuilder.createParameterVariable(
- Scope, Name, *ArgNo, Unit, Line, Ty,
- CGM.getLangOpts().Optimize, Flags)
- : DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty,
- CGM.getLangOpts().Optimize,
- Flags, Align);
+ auto *D =
+ ArgNo ? DBuilder.createParameterVariable(Scope, Name, *ArgNo, Unit, Line,
+ Ty, CGM.getLangOpts().Optimize,
+ Flags)
+ : DBuilder.createAutoVariable(Scope, Name, Unit, Line, Ty,
+ CGM.getLangOpts().Optimize, Flags,
+ Align, VD->isConstexpr());
// Insert an llvm.dbg.declare into the current block.
DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
@@ -4510,7 +4516,7 @@
Var->hasLocalLinkage(), true,
Expr.empty() ? nullptr : DBuilder.createExpression(Expr),
getOrCreateStaticDataMemberDeclarationOrNull(D), TemplateParameters,
- Align);
+ Align, D->isConstexpr());
Var->addDebugInfo(GVE);
}
DeclCache[D->getCanonicalDecl()].reset(GVE);
@@ -4611,7 +4617,7 @@
GV.reset(DBuilder.createGlobalVariableExpression(
DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty,
true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
- TemplateParameters, Align));
+ TemplateParameters, Align, VarD ? VarD->isConstexpr() : false));
}
void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits