summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/DebugInfo.h3
-rw-r--r--llvm/lib/IR/DebugInfo.cpp19
-rw-r--r--llvm/unittests/IR/DebugInfoTest.cpp46
3 files changed, 68 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h
index bf15d588be5..1674b004f7b 100644
--- a/llvm/include/llvm/IR/DebugInfo.h
+++ b/llvm/include/llvm/IR/DebugInfo.h
@@ -137,6 +137,9 @@ public:
FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic
};
+ static unsigned getFlag(StringRef Flag);
+ static const char *getFlagString(unsigned Flag);
+
protected:
const MDNode *DbgNode;
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index f682ad548f2..ad75fbae80d 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -17,6 +17,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
@@ -36,6 +37,24 @@ using namespace llvm::dwarf;
// DIDescriptor
//===----------------------------------------------------------------------===//
+unsigned DIDescriptor::getFlag(StringRef Flag) {
+ return StringSwitch<unsigned>(Flag)
+#define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME)
+#include "llvm/IR/DebugInfoFlags.def"
+ .Default(0);
+}
+
+const char *DIDescriptor::getFlagString(unsigned Flag) {
+ switch (Flag) {
+ default:
+ return "";
+#define HANDLE_DI_FLAG(ID, NAME) \
+ case Flag##NAME: \
+ return "DIFlag" #NAME;
+#include "llvm/IR/DebugInfoFlags.def"
+ }
+}
+
bool DIDescriptor::Verify() const {
return DbgNode &&
(DIDerivedType(DbgNode).Verify() ||
diff --git a/llvm/unittests/IR/DebugInfoTest.cpp b/llvm/unittests/IR/DebugInfoTest.cpp
index 1fa851e39ae..fa05425e333 100644
--- a/llvm/unittests/IR/DebugInfoTest.cpp
+++ b/llvm/unittests/IR/DebugInfoTest.cpp
@@ -65,4 +65,50 @@ TEST(DebugInfoTest, DIHeaderFieldIterator) {
ASSERT_EQ("stuff", *++MAKE_FIELD_ITERATOR("\0stuff"));
}
+TEST(DIDescriptorTest, getFlag) {
+ // Some valid flags.
+ EXPECT_EQ(DIDescriptor::FlagPublic, DIDescriptor::getFlag("DIFlagPublic"));
+ EXPECT_EQ(DIDescriptor::FlagProtected,
+ DIDescriptor::getFlag("DIFlagProtected"));
+ EXPECT_EQ(DIDescriptor::FlagPrivate, DIDescriptor::getFlag("DIFlagPrivate"));
+ EXPECT_EQ(DIDescriptor::FlagVector, DIDescriptor::getFlag("DIFlagVector"));
+ EXPECT_EQ(DIDescriptor::FlagRValueReference,
+ DIDescriptor::getFlag("DIFlagRValueReference"));
+
+ // FlagAccessibility shouldn't work.
+ EXPECT_EQ(0u, DIDescriptor::getFlag("DIFlagAccessibility"));
+
+ // Some other invalid strings.
+ EXPECT_EQ(0u, DIDescriptor::getFlag("FlagVector"));
+ EXPECT_EQ(0u, DIDescriptor::getFlag("Vector"));
+ EXPECT_EQ(0u, DIDescriptor::getFlag("other things"));
+ EXPECT_EQ(0u, DIDescriptor::getFlag("DIFlagOther"));
+}
+
+TEST(DIDescriptorTest, getFlagString) {
+ // Some valid flags.
+ EXPECT_EQ(StringRef("DIFlagPublic"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagPublic));
+ EXPECT_EQ(StringRef("DIFlagProtected"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagProtected));
+ EXPECT_EQ(StringRef("DIFlagPrivate"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagPrivate));
+ EXPECT_EQ(StringRef("DIFlagVector"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagVector));
+ EXPECT_EQ(StringRef("DIFlagRValueReference"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagRValueReference));
+
+ // FlagAccessibility actually equals FlagPublic.
+ EXPECT_EQ(StringRef("DIFlagPublic"),
+ DIDescriptor::getFlagString(DIDescriptor::FlagAccessibility));
+
+ // Some other invalid flags.
+ EXPECT_EQ(StringRef(), DIDescriptor::getFlagString(DIDescriptor::FlagPublic |
+ DIDescriptor::FlagVector));
+ EXPECT_EQ(StringRef(),
+ DIDescriptor::getFlagString(DIDescriptor::FlagFwdDecl |
+ DIDescriptor::FlagArtificial));
+ EXPECT_EQ(StringRef(), DIDescriptor::getFlagString(0xffff));
+}
+
} // end namespace
OpenPOWER on IntegriCloud