[llvm] r333806 - [DebugInfo] Refactoring DIType::setFlags to DIType::cloneWithFlags, NFC
Roman Tereshin via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 1 16:15:09 PDT 2018
Author: rtereshin
Date: Fri Jun 1 16:15:09 2018
New Revision: 333806
URL: http://llvm.org/viewvc/llvm-project?rev=333806&view=rev
Log:
[DebugInfo] Refactoring DIType::setFlags to DIType::cloneWithFlags, NFC
and using the latter in DIBuilder::createArtificialType and
DIBuilder::createObjectPointerType methods as well as introducing
mirroring DISubprogram::cloneWithFlags and
DIBuilder::createArtificialSubprogram methods.
The primary goal here is to add createArtificialSubprogram to support
a pass downstream while keeping the method consistent with the
existing ones and making sure we don't encourage changing already
created DI-nodes.
Reviewed By: aprantl
Differential Revision: https://reviews.llvm.org/D47615
Modified:
llvm/trunk/include/llvm-c/DebugInfo.h
llvm/trunk/include/llvm/IR/DIBuilder.h
llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
llvm/trunk/lib/IR/DIBuilder.cpp
llvm/trunk/unittests/IR/IRBuilderTest.cpp
llvm/trunk/unittests/IR/MetadataTest.cpp
Modified: llvm/trunk/include/llvm-c/DebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/DebugInfo.h?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/include/llvm-c/DebugInfo.h (original)
+++ llvm/trunk/include/llvm-c/DebugInfo.h Fri Jun 1 16:15:09 2018
@@ -678,8 +678,7 @@ LLVMDIBuilderCreateObjCProperty(LLVMDIBu
LLVMMetadataRef Ty);
/**
- * Create a new DIType* with the "object pointer"
- * flag set.
+ * Create a uniqued DIType* clone with FlagObjectPointer and FlagArtificial set.
* \param Builder The DIBuilder.
* \param Type The underlying type to which this pointer points.
*/
@@ -851,7 +850,7 @@ LLVMMetadataRef LLVMDIBuilderCreateClass
const char *UniqueIdentifier, size_t UniqueIdentifierLen);
/**
- * Create a new DIType* with "artificial" flag set.
+ * Create a uniqued DIType* clone with FlagArtificial set.
* \param Builder The DIBuilder.
* \param Type The underlying type.
*/
Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
+++ llvm/trunk/include/llvm/IR/DIBuilder.h Fri Jun 1 16:15:09 2018
@@ -515,12 +515,15 @@ namespace llvm {
DINode::DIFlags Flags = DINode::FlagZero,
unsigned CC = 0);
- /// Create a new DIType* with "artificial" flag set.
- DIType *createArtificialType(DIType *Ty);
+ /// Create a distinct clone of \p SP with FlagArtificial set.
+ static DISubprogram *createArtificialSubprogram(DISubprogram *SP);
- /// Create a new DIType* with the "object pointer"
- /// flag set.
- DIType *createObjectPointerType(DIType *Ty);
+ /// Create a uniqued clone of \p Ty with FlagArtificial set.
+ static DIType *createArtificialType(DIType *Ty);
+
+ /// Create a uniqued clone of \p Ty with FlagObjectPointer and
+ /// FlagArtificial set.
+ static DIType *createObjectPointerType(DIType *Ty);
/// Create a permanent forward-declared type.
DICompositeType *createForwardDecl(unsigned Tag, StringRef Name,
Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
+++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Fri Jun 1 16:15:09 2018
@@ -679,9 +679,11 @@ public:
Metadata *getRawScope() const { return getOperand(1); }
MDString *getRawName() const { return getOperandAs<MDString>(2); }
- void setFlags(DIFlags NewFlags) {
- assert(!isUniqued() && "Cannot set flags on uniqued nodes");
- Flags = NewFlags;
+ /// Returns a new temporary DIType with updated Flags
+ TempDIType cloneWithFlags(DIFlags NewFlags) const {
+ auto NewTy = clone();
+ NewTy->Flags = NewFlags;
+ return NewTy;
}
bool isPrivate() const {
@@ -1679,6 +1681,13 @@ public:
TempDISubprogram clone() const { return cloneImpl(); }
+ /// Returns a new temporary DISubprogram with updated Flags
+ TempDISubprogram cloneWithFlags(DIFlags NewFlags) const {
+ auto NewSP = clone();
+ NewSP->Flags = NewFlags;
+ return NewSP;
+ }
+
public:
unsigned getLine() const { return Line; }
unsigned getVirtuality() const { return Virtuality; }
Modified: llvm/trunk/lib/IR/DIBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DIBuilder.cpp (original)
+++ llvm/trunk/lib/IR/DIBuilder.cpp Fri Jun 1 16:15:09 2018
@@ -535,10 +535,14 @@ DICompositeType *DIBuilder::createVector
return R;
}
-static DIType *createTypeWithFlags(LLVMContext &Context, DIType *Ty,
+DISubprogram *DIBuilder::createArtificialSubprogram(DISubprogram *SP) {
+ auto NewSP = SP->cloneWithFlags(SP->getFlags() | DINode::FlagArtificial);
+ return MDNode::replaceWithDistinct(std::move(NewSP));
+}
+
+static DIType *createTypeWithFlags(const DIType *Ty,
DINode::DIFlags FlagsToSet) {
- auto NewTy = Ty->clone();
- NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
+ auto NewTy = Ty->cloneWithFlags(Ty->getFlags() | FlagsToSet);
return MDNode::replaceWithUniqued(std::move(NewTy));
}
@@ -546,7 +550,7 @@ DIType *DIBuilder::createArtificialType(
// FIXME: Restrict this to the nodes where it's valid.
if (Ty->isArtificial())
return Ty;
- return createTypeWithFlags(VMContext, Ty, DINode::FlagArtificial);
+ return createTypeWithFlags(Ty, DINode::FlagArtificial);
}
DIType *DIBuilder::createObjectPointerType(DIType *Ty) {
@@ -554,7 +558,7 @@ DIType *DIBuilder::createObjectPointerTy
if (Ty->isObjectPointer())
return Ty;
DINode::DIFlags Flags = DINode::FlagObjectPointer | DINode::FlagArtificial;
- return createTypeWithFlags(VMContext, Ty, Flags);
+ return createTypeWithFlags(Ty, Flags);
}
void DIBuilder::retainType(DIScope *T) {
Modified: llvm/trunk/unittests/IR/IRBuilderTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/IRBuilderTest.cpp?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/IRBuilderTest.cpp (original)
+++ llvm/trunk/unittests/IR/IRBuilderTest.cpp Fri Jun 1 16:15:09 2018
@@ -459,6 +459,62 @@ TEST_F(IRBuilderTest, DIBuilder) {
EXPECT_TRUE(verifyModule(*M));
}
+TEST_F(IRBuilderTest, createArtificialSubprogram) {
+ IRBuilder<> Builder(BB);
+ DIBuilder DIB(*M);
+ auto File = DIB.createFile("main.c", "/");
+ auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C, File, "clang",
+ /*isOptimized=*/true, /*Flags=*/"",
+ /*Runtime Version=*/0);
+ auto Type = DIB.createSubroutineType(DIB.getOrCreateTypeArray(None));
+ auto SP = DIB.createFunction(CU, "foo", /*LinkageName=*/"", File,
+ /*LineNo=*/1, Type, /*isLocalToUnit=*/false,
+ /*isDefinition=*/true, /*ScopeLine=*/2,
+ DINode::FlagZero, /*isOptimized=*/true);
+ EXPECT_TRUE(SP->isDistinct());
+
+ F->setSubprogram(SP);
+ AllocaInst *I = Builder.CreateAlloca(Builder.getInt8Ty());
+ ReturnInst *R = Builder.CreateRetVoid();
+ I->setDebugLoc(DebugLoc::get(3, 2, SP));
+ R->setDebugLoc(DebugLoc::get(4, 2, SP));
+ DIB.finalize();
+ EXPECT_FALSE(verifyModule(*M));
+
+ Function *G = Function::Create(F->getFunctionType(),
+ Function::ExternalLinkage, "", M.get());
+ BasicBlock *GBB = BasicBlock::Create(Ctx, "", G);
+ Builder.SetInsertPoint(GBB);
+ I->removeFromParent();
+ Builder.Insert(I);
+ Builder.CreateRetVoid();
+ EXPECT_FALSE(verifyModule(*M));
+
+ DISubprogram *GSP = DIBuilder::createArtificialSubprogram(F->getSubprogram());
+ EXPECT_EQ(SP->getFile(), GSP->getFile());
+ EXPECT_EQ(SP->getType(), GSP->getType());
+ EXPECT_EQ(SP->getLine(), GSP->getLine());
+ EXPECT_EQ(SP->getScopeLine(), GSP->getScopeLine());
+ EXPECT_TRUE(GSP->isDistinct());
+
+ G->setSubprogram(GSP);
+ EXPECT_TRUE(verifyModule(*M));
+
+ auto *InlinedAtNode =
+ DILocation::getDistinct(Ctx, GSP->getScopeLine(), 0, GSP);
+ DebugLoc DL = I->getDebugLoc();
+ DenseMap<const MDNode *, MDNode *> IANodes;
+ auto IA = DebugLoc::appendInlinedAt(DL, InlinedAtNode, Ctx, IANodes);
+ auto NewDL = DebugLoc::get(DL.getLine(), DL.getCol(), DL.getScope(), IA);
+ I->setDebugLoc(NewDL);
+ EXPECT_FALSE(verifyModule(*M));
+
+ EXPECT_EQ("foo", SP->getName());
+ EXPECT_EQ("foo", GSP->getName());
+ EXPECT_FALSE(SP->isArtificial());
+ EXPECT_TRUE(GSP->isArtificial());
+}
+
TEST_F(IRBuilderTest, InsertExtractElement) {
IRBuilder<> Builder(BB);
Modified: llvm/trunk/unittests/IR/MetadataTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=333806&r1=333805&r2=333806&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Fri Jun 1 16:15:09 2018
@@ -1051,7 +1051,7 @@ TEST_F(DITypeTest, clone) {
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
-TEST_F(DITypeTest, setFlags) {
+TEST_F(DITypeTest, cloneWithFlags) {
// void (void)
Metadata *TypesOps[] = {nullptr};
Metadata *Types = MDTuple::get(Context, TypesOps);
@@ -1059,17 +1059,15 @@ TEST_F(DITypeTest, setFlags) {
DIType *D =
DISubroutineType::getDistinct(Context, DINode::FlagZero, 0, Types);
EXPECT_EQ(DINode::FlagZero, D->getFlags());
- D->setFlags(DINode::FlagRValueReference);
- EXPECT_EQ(DINode::FlagRValueReference, D->getFlags());
- D->setFlags(DINode::FlagZero);
+ TempDIType D2 = D->cloneWithFlags(DINode::FlagRValueReference);
+ EXPECT_EQ(DINode::FlagRValueReference, D2->getFlags());
EXPECT_EQ(DINode::FlagZero, D->getFlags());
TempDIType T =
DISubroutineType::getTemporary(Context, DINode::FlagZero, 0, Types);
EXPECT_EQ(DINode::FlagZero, T->getFlags());
- T->setFlags(DINode::FlagRValueReference);
- EXPECT_EQ(DINode::FlagRValueReference, T->getFlags());
- T->setFlags(DINode::FlagZero);
+ TempDIType T2 = T->cloneWithFlags(DINode::FlagRValueReference);
+ EXPECT_EQ(DINode::FlagRValueReference, T2->getFlags());
EXPECT_EQ(DINode::FlagZero, T->getFlags());
}
More information about the llvm-commits
mailing list