From 8328b6932ffeb41af7fc1260a48d36cf2a427f6f Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 9 Aug 2013 17:17:12 +0000 Subject: 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188082 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo.h | 1 + lib/IR/DebugInfo.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/llvm/DebugInfo.h b/include/llvm/DebugInfo.h index 74416db..b02446a 100644 --- a/include/llvm/DebugInfo.h +++ b/include/llvm/DebugInfo.h @@ -323,6 +323,7 @@ namespace llvm { DIArray getTypeArray() const { return getFieldAs(10); } void setTypeArray(DIArray Elements, DIArray TParams = DIArray()); + void addMember(DISubprogram S); unsigned getRunTimeLang() const { return getUnsignedField(11); } DICompositeType getContainingType() const { return getFieldAs(12); diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index fc93249..0f7ddb5 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -647,6 +647,19 @@ void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) { DbgNode = N; } +void DICompositeType::addMember(DISubprogram S) { + SmallVector 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 N(*this); -- cgit v1.1