From a496490358cf9ff2a40ceeba09ec96fcc018b8c6 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sat, 7 Feb 2015 00:36:23 +0000 Subject: [PATCH] Support: Use Dwarf.def for DW_VIRTUALITY, NFC Use definition file for `DW_VIRTUALITY_*`. Add a `DW_VIRTUALITY_max` both for ease of testing and for future use by the `LLParser`. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228473 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Dwarf.def | 13 ++++++++++++- include/llvm/Support/Dwarf.h | 7 +++---- lib/Support/Dwarf.cpp | 10 ++++++---- unittests/Support/DwarfTest.cpp | 14 ++++++++++++++ 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/include/llvm/Support/Dwarf.def b/include/llvm/Support/Dwarf.def index 9c788298cf7..b859f198ea2 100644 --- a/include/llvm/Support/Dwarf.def +++ b/include/llvm/Support/Dwarf.def @@ -12,7 +12,8 @@ //===----------------------------------------------------------------------===// // TODO: Add other DW-based macros. -#if !(defined HANDLE_DW_TAG || defined HANDLE_DW_LANG || defined HANDLE_DW_ATE) +#if !(defined HANDLE_DW_TAG || defined HANDLE_DW_LANG || \ + defined HANDLE_DW_ATE || defined HANDLE_DW_VIRTUALITY) #error "Missing macro definition of HANDLE_DW*" #endif @@ -28,6 +29,10 @@ #define HANDLE_DW_ATE(ID, NAME) #endif +#ifndef HANDLE_DW_VIRTUALITY +#define HANDLE_DW_VIRTUALITY(ID, NAME) +#endif + HANDLE_DW_TAG(0x0001, array_type) HANDLE_DW_TAG(0x0002, class_type) HANDLE_DW_TAG(0x0003, entry_point) @@ -159,6 +164,12 @@ HANDLE_DW_ATE(0x0e, unsigned_fixed) HANDLE_DW_ATE(0x0f, decimal_float) HANDLE_DW_ATE(0x10, UTF) +// DWARF virtuality codes. +HANDLE_DW_VIRTUALITY(0x00, none) +HANDLE_DW_VIRTUALITY(0x01, virtual) +HANDLE_DW_VIRTUALITY(0x02, pure_virtual) + #undef HANDLE_DW_TAG #undef HANDLE_DW_LANG #undef HANDLE_DW_ATE +#undef HANDLE_DW_VIRTUALITY diff --git a/include/llvm/Support/Dwarf.h b/include/llvm/Support/Dwarf.h index b1bcb160fb6..fc99a4b3236 100644 --- a/include/llvm/Support/Dwarf.h +++ b/include/llvm/Support/Dwarf.h @@ -494,10 +494,9 @@ enum VisibilityAttribute { }; enum VirtualityAttribute { - // Virtuality codes - DW_VIRTUALITY_none = 0x00, - DW_VIRTUALITY_virtual = 0x01, - DW_VIRTUALITY_pure_virtual = 0x02 +#define HANDLE_DW_VIRTUALITY(ID, NAME) DW_VIRTUALITY_##NAME = ID, +#include "llvm/Support/Dwarf.def" + DW_VIRTUALITY_max = 0x02 }; enum SourceLanguage { diff --git a/lib/Support/Dwarf.cpp b/lib/Support/Dwarf.cpp index af6db59302c..866d7e55c85 100644 --- a/lib/Support/Dwarf.cpp +++ b/lib/Support/Dwarf.cpp @@ -464,11 +464,13 @@ const char *llvm::dwarf::VisibilityString(unsigned Visibility) { const char *llvm::dwarf::VirtualityString(unsigned Virtuality) { switch (Virtuality) { - case DW_VIRTUALITY_none: return "DW_VIRTUALITY_none"; - case DW_VIRTUALITY_virtual: return "DW_VIRTUALITY_virtual"; - case DW_VIRTUALITY_pure_virtual: return "DW_VIRTUALITY_pure_virtual"; + default: + return nullptr; +#define HANDLE_DW_VIRTUALITY(ID, NAME) \ + case DW_VIRTUALITY_##NAME: \ + return "DW_VIRTUALITY_" #NAME; +#include "llvm/Support/Dwarf.def" } - return nullptr; } const char *llvm::dwarf::LanguageString(unsigned Language) { diff --git a/unittests/Support/DwarfTest.cpp b/unittests/Support/DwarfTest.cpp index 25f5574ad7b..38a179f7929 100644 --- a/unittests/Support/DwarfTest.cpp +++ b/unittests/Support/DwarfTest.cpp @@ -95,4 +95,18 @@ TEST(DwarfTest, getAttributeEncoding) { EXPECT_EQ(0u, getAttributeEncoding("DW_ATE_hi_user")); } +TEST(DwarfTest, VirtualityString) { + EXPECT_EQ("DW_VIRTUALITY_none", VirtualityString(DW_VIRTUALITY_none)); + EXPECT_EQ("DW_VIRTUALITY_virtual", VirtualityString(DW_VIRTUALITY_virtual)); + EXPECT_EQ("DW_VIRTUALITY_pure_virtual", + VirtualityString(DW_VIRTUALITY_pure_virtual)); + + // DW_VIRTUALITY_max should be pure virtual. + EXPECT_EQ("DW_VIRTUALITY_pure_virtual", VirtualityString(DW_VIRTUALITY_max)); + + // Invalid numbers shouldn't be stringified. + EXPECT_EQ(nullptr, VirtualityString(DW_VIRTUALITY_max + 1)); + EXPECT_EQ(nullptr, VirtualityString(DW_VIRTUALITY_max + 77)); +} + } // end namespace