summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2013-08-09 17:17:12 +0000
committerDavid Blaikie <dblaikie@gmail.com>2013-08-09 17:17:12 +0000
commitf103c2f946abebffeea9f033c0393866d0d1f6a2 (patch)
tree1f10a72b161b5fd21b78a8d0a067913d62bc6880
parenteeeb4828bbcd39e10f7d3acdef6a8f3fcc78c84b (diff)
downloadbcm5719-llvm-f103c2f946abebffeea9f033c0393866d0d1f6a2.tar.gz
bcm5719-llvm-f103c2f946abebffeea9f033c0393866d0d1f6a2.zip
DebugInfo: provide the ability to add members to a class after it has been constructed
This is necessary to allow Clang to only emit implicit members when there is code generated for them, rather than whenever they are ODR used. llvm-svn: 188082
-rw-r--r--llvm/include/llvm/DebugInfo.h1
-rw-r--r--llvm/lib/IR/DebugInfo.cpp13
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/include/llvm/DebugInfo.h b/llvm/include/llvm/DebugInfo.h
index 74416db2175..b02446abbbf 100644
--- a/llvm/include/llvm/DebugInfo.h
+++ b/llvm/include/llvm/DebugInfo.h
@@ -323,6 +323,7 @@ namespace llvm {
DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
void setTypeArray(DIArray Elements, DIArray TParams = DIArray());
+ void addMember(DISubprogram S);
unsigned getRunTimeLang() const { return getUnsignedField(11); }
DICompositeType getContainingType() const {
return getFieldAs<DICompositeType>(12);
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index fc9324949d0..0f7ddb5961c 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -647,6 +647,19 @@ void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) {
DbgNode = N;
}
+void DICompositeType::addMember(DISubprogram S) {
+ SmallVector<llvm::Value *, 16> M;
+ DIArray OrigM = getTypeArray();
+ unsigned Elements = OrigM.getNumElements();
+ if (Elements == 1 && !OrigM.getElement(0))
+ Elements = 0;
+ M.reserve(Elements + 1);
+ for (unsigned i = 0; i != Elements; ++i)
+ M.push_back(OrigM.getElement(i));
+ M.push_back(S);
+ setTypeArray(DIArray(MDNode::get(DbgNode->getContext(), M)));
+}
+
/// \brief Set the containing type.
void DICompositeType::setContainingType(DICompositeType ContainingType) {
TrackingVH<MDNode> N(*this);
OpenPOWER on IntegriCloud