]> granicus.if.org Git - llvm/commitdiff
[CodeView] Fix dumping of public symbol record flags
authorReid Kleckner <rnk@google.com>
Mon, 19 Jun 2017 16:54:51 +0000 (16:54 +0000)
committerReid Kleckner <rnk@google.com>
Mon, 19 Jun 2017 16:54:51 +0000 (16:54 +0000)
I noticed nonsensical type information while dumping PDBs produced by
MSVC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305708 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/CodeView/CodeView.h
include/llvm/DebugInfo/CodeView/EnumTables.h
include/llvm/DebugInfo/CodeView/SymbolRecord.h
lib/DebugInfo/CodeView/EnumTables.cpp
lib/DebugInfo/CodeView/SymbolDumper.cpp
lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
lib/ObjectYAML/CodeViewYAMLSymbols.cpp
test/DebugInfo/PDB/pdbdump-headers.test
tools/llvm-pdbutil/MinimalSymbolDumper.cpp

index 6820e26b754c0b9e60a80ee7fb30ab28442cb6d0..b7a7e33abadf85643c8e311af790b87a4de79f49 100644 (file)
@@ -402,6 +402,16 @@ enum class LocalSymFlags : uint16_t {
 };
 CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(LocalSymFlags)
 
+/// Corresponds to the CV_PUBSYMFLAGS bitfield.
+enum class PublicSymFlags : uint32_t {
+  None = 0,
+  Code = 1 << 0,
+  Function = 1 << 1,
+  Managed = 1 << 2,
+  MSIL = 1 << 3,
+};
+CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(PublicSymFlags)
+
 /// Corresponds to the CV_PROCFLAGS bitfield.
 enum class ProcSymFlags : uint8_t {
   None = 0,
index 013e440613fc1a31bd4e25b5389ee6f396714965..5d54bb4cca8419175c7e0bffa10bebdbdbdeeeac 100644 (file)
@@ -22,6 +22,7 @@ namespace codeview {
 ArrayRef<EnumEntry<SymbolKind>> getSymbolTypeNames();
 ArrayRef<EnumEntry<TypeLeafKind>> getTypeLeafNames();
 ArrayRef<EnumEntry<uint16_t>> getRegisterNames();
+ArrayRef<EnumEntry<uint32_t>> getPublicSymFlagNames();
 ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames();
 ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames();
 ArrayRef<EnumEntry<uint8_t>> getFrameCookieKindNames();
index 5f85ed28cb3a1968facdcad0e11914f8e048388f..1cf77fcdecbe066347731f324462a19031ba045a 100644 (file)
@@ -363,7 +363,7 @@ public:
       : SymbolRecord(SymbolRecordKind::PublicSym32),
         RecordOffset(RecordOffset) {}
 
-  TypeIndex Index;
+  PublicSymFlags Flags;
   uint32_t Offset;
   uint16_t Segment;
   StringRef Name;
index 01d8ccf2d31e8636ed09c573d0e5d83c1e0c24a7..ec00af28395e5be01fdb6b54adceefcb1db37641 100644 (file)
@@ -82,6 +82,13 @@ static const EnumEntry<uint16_t> RegisterNames[] = {
     CV_ENUM_CLASS_ENT(RegisterId, R15),
 };
 
+static const EnumEntry<uint32_t> PublicSymFlagNames[] = {
+    CV_ENUM_CLASS_ENT(PublicSymFlags, Code),
+    CV_ENUM_CLASS_ENT(PublicSymFlags, Function),
+    CV_ENUM_CLASS_ENT(PublicSymFlags, Managed),
+    CV_ENUM_CLASS_ENT(PublicSymFlags, MSIL),
+};
+
 static const EnumEntry<uint8_t> ProcSymFlagNames[] = {
     CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
     CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
@@ -338,6 +345,9 @@ ArrayRef<EnumEntry<uint16_t>> getRegisterNames() {
   return makeArrayRef(RegisterNames);
 }
 
+ArrayRef<EnumEntry<uint32_t>> getPublicSymFlagNames() {
+  return makeArrayRef(PublicSymFlagNames);
+}
 ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames() {
   return makeArrayRef(ProcSymFlagNames);
 }
index 36abafc079edbc7b0ca24f49f34bd18b1256f5df..b9fa9b6a6ad7ef20c7010fe984e2fa3378887e93 100644 (file)
@@ -524,7 +524,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
 
 Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
   DictScope S(W, "PublicSym");
-  printTypeIndex("Type", Public.Index);
+  W.printFlags("Flags", uint32_t(Public.Flags), getPublicSymFlagNames());
   W.printNumber("Seg", Public.Segment);
   W.printNumber("Off", Public.Offset);
   W.printString("Name", Public.Name);
index d731dc1b0a37230ed490d0fd0fff0c25afd37ecc..923837a45d9fcdeb169ca3cc440f5e316e44b4bb 100644 (file)
@@ -361,7 +361,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
 Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                             PublicSym32 &Public) {
 
-  error(IO.mapInteger(Public.Index));
+  error(IO.mapEnum(Public.Flags));
   error(IO.mapInteger(Public.Offset));
   error(IO.mapInteger(Public.Segment));
   error(IO.mapStringZ(Public.Name));
index ba3a2abe2097821585d23bb8373e0d2ab7fa5889..2f78676c6c879ebc7b6191dd055fc36bb0f15f04 100644 (file)
@@ -40,6 +40,7 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(FrameCookieKind)
 LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym2Flags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym3Flags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(ExportFlags)
+LLVM_YAML_DECLARE_BITSET_TRAITS(PublicSymFlags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(LocalSymFlags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(ProcSymFlags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(FrameProcedureOptions)
@@ -93,6 +94,14 @@ void ScalarBitSetTraits<ExportFlags>::bitset(IO &io, ExportFlags &Flags) {
   }
 }
 
+void ScalarBitSetTraits<PublicSymFlags>::bitset(IO &io, PublicSymFlags &Flags) {
+  auto FlagNames = getProcSymFlagNames();
+  for (const auto &E : FlagNames) {
+    io.bitSetCase(Flags, E.Name.str().c_str(),
+                  static_cast<PublicSymFlags>(E.Value));
+  }
+}
+
 void ScalarBitSetTraits<LocalSymFlags>::bitset(IO &io, LocalSymFlags &Flags) {
   auto FlagNames = getLocalFlagNames();
   for (const auto &E : FlagNames) {
@@ -298,7 +307,7 @@ template <> void SymbolRecordImpl<RegisterSym>::map(IO &IO) {
 }
 
 template <> void SymbolRecordImpl<PublicSym32>::map(IO &IO) {
-  IO.mapRequired("Type", Symbol.Index);
+  IO.mapRequired("Flags", Symbol.Flags);
   IO.mapRequired("Seg", Symbol.Segment);
   IO.mapRequired("Off", Symbol.Offset);
   IO.mapRequired("Name", Symbol.Name);
index fa9a25108fac7f407d978d229766a70fc87b4992..afedbb5c25768ecc5e1d6a777e1c58d2e314e047 100644 (file)
@@ -458,9 +458,9 @@ ALL:        Hash Adjusters:
 ALL:                             Public Symbols
 ALL-NEXT: ============================================================
 ALL-NEXT:   - S_PUB32 [size = 36] `?__purecall@@3PAXA`
-ALL-NEXT:       type = <no type>, addr = 0003:0000
+ALL-NEXT:       flags = none, addr = 0003:0000
 ALL-NEXT:   - S_PUB32 [size = 20] `_main`
-ALL-NEXT:       type = 0x0002 (<unknown simple type>), addr = 0001:0016
+ALL-NEXT:       flags = function, addr = 0001:0016
 ALL-NEXT:   - S_PROCREF [size = 20] `main`
 ALL-NEXT:       module = 1, sum name = 0, offset = 120
 ALL-NEXT:   - S_GDATA32 [size = 28] `__purecall`
index 8b36de0b715760e634262cd598a437df1d135744..7f5412d598856479cafa67590c13eaed370e1fef 100644 (file)
@@ -146,6 +146,19 @@ static std::string formatFrameProcedureOptions(uint32_t IndentLevel,
   return typesetItemList(Opts, 4, IndentLevel, " | ");
 }
 
+static std::string formatPublicSymFlags(uint32_t IndentLevel,
+                                        PublicSymFlags Flags) {
+  std::vector<std::string> Opts;
+  if (Flags == PublicSymFlags::None)
+    return "none";
+
+  PUSH_FLAG(PublicSymFlags, Code, Flags, "code");
+  PUSH_FLAG(PublicSymFlags, Function, Flags, "function");
+  PUSH_FLAG(PublicSymFlags, Managed, Flags, "managed");
+  PUSH_FLAG(PublicSymFlags, MSIL, Flags, "msil");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
 static std::string formatProcSymFlags(uint32_t IndentLevel,
                                       ProcSymFlags Flags) {
   std::vector<std::string> Opts;
@@ -659,7 +672,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
                                             PublicSym32 &Public) {
   P.format(" `{0}`", Public.Name);
   AutoIndent Indent(P);
-  P.formatLine("type = {0}, addr = {1}", typeIndex(Public.Index),
+  P.formatLine("flags = {0}, addr = {1}",
+               formatPublicSymFlags(P.getIndentLevel() + 9, Public.Flags),
                formatSegmentOffset(Public.Segment, Public.Offset));
   return Error::success();
 }