]> granicus.if.org Git - llvm/commitdiff
[codeview] Finish support for reading and writing S_ANNOTATION records
authorReid Kleckner <rnk@google.com>
Wed, 15 May 2019 20:53:39 +0000 (20:53 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 15 May 2019 20:53:39 +0000 (20:53 +0000)
Implement dumping via llvm-pdbutil and llvm-readobj.

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

include/llvm/DebugInfo/CodeView/CodeViewSymbols.def
include/llvm/DebugInfo/CodeView/SymbolRecord.h
lib/DebugInfo/CodeView/SymbolDumper.cpp
lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
lib/ObjectYAML/CodeViewYAMLSymbols.cpp
test/DebugInfo/PDB/Inputs/unknown-symbol.yaml
test/DebugInfo/PDB/annotation.test [new file with mode: 0644]
test/DebugInfo/PDB/pdb-unknown-symbol.test
tools/llvm-pdbutil/MinimalSymbolDumper.cpp

index e36d80466137d181eedd5b1c0ac97495a94124fe..4f8ccfdd16af59b8a04b4c8e2aa92c2d670c57ee 100644 (file)
@@ -102,7 +102,6 @@ CV_SYMBOL(S_LPROCIA64_ST  , 0x1015)
 CV_SYMBOL(S_GPROCIA64_ST  , 0x1016)
 CV_SYMBOL(S_LOCALSLOT_ST  , 0x1017)
 CV_SYMBOL(S_PARAMSLOT_ST  , 0x1018)
-CV_SYMBOL(S_ANNOTATION    , 0x1019)
 CV_SYMBOL(S_GMANPROC_ST   , 0x101a)
 CV_SYMBOL(S_LMANPROC_ST   , 0x101b)
 CV_SYMBOL(S_RESERVED1     , 0x101c)
@@ -254,6 +253,7 @@ SYMBOL_RECORD(S_LTHREAD32     , 0x1112, ThreadLocalDataSym)
 SYMBOL_RECORD_ALIAS(S_GTHREAD32     , 0x1113, GlobalTLS, ThreadLocalDataSym)
 
 SYMBOL_RECORD(S_UNAMESPACE    , 0x1124, UsingNamespaceSym)
+SYMBOL_RECORD(S_ANNOTATION    , 0x1019, AnnotationSym)
 
 #undef CV_SYMBOL
 #undef SYMBOL_RECORD
index ac7b106e7b96ee30337f3f47b5a05d88a320b77c..b98ada221a4a768e959c4ae0362ad19ec2234b31 100644 (file)
@@ -973,7 +973,7 @@ class UsingNamespaceSym : public SymbolRecord {
 public:
   explicit UsingNamespaceSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
   explicit UsingNamespaceSym(uint32_t RecordOffset)
-      : SymbolRecord(SymbolRecordKind::RegRelativeSym),
+      : SymbolRecord(SymbolRecordKind::UsingNamespaceSym),
         RecordOffset(RecordOffset) {}
 
   StringRef Name;
@@ -982,6 +982,19 @@ public:
 };
 
 // S_ANNOTATION
+class AnnotationSym : public SymbolRecord {
+public:
+  explicit AnnotationSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
+  explicit AnnotationSym(uint32_t RecordOffset)
+      : SymbolRecord(SymbolRecordKind::AnnotationSym),
+        RecordOffset(RecordOffset) {}
+
+  uint32_t CodeOffset = 0;
+  uint16_t Segment = 0;
+  std::vector<StringRef> Strings;
+
+  uint32_t RecordOffset;
+};
 
 using CVSymbol = CVRecord<SymbolKind>;
 using CVSymbolArray = VarStreamArray<CVSymbol>;
index 783b85409f7fe5beffe4a6ca8c8955b6c002aa58..44ce04a49e99855019346939eea8b607f047ccc9 100644 (file)
@@ -630,6 +630,18 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
   return Error::success();
 }
 
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+                                           AnnotationSym &Annot) {
+  W.printHex("Offset", Annot.CodeOffset);
+  W.printHex("Segment", Annot.Segment);
+
+  ListScope S(W, "Strings");
+  for (StringRef Str : Annot.Strings)
+    W.printString(Str);
+
+  return Error::success();
+}
+
 Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) {
   W.printNumber("Length", CVR.length());
   return Error::success();
index 36d77965daf62555151896e24a0ad514a451e1c1..70889839ef4861f5bb8cdae67728c6bcca6a02ac 100644 (file)
@@ -471,6 +471,18 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
   return Error::success();
 }
 
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+                                            AnnotationSym &Annot) {
+
+  error(IO.mapInteger(Annot.CodeOffset));
+  error(IO.mapInteger(Annot.Segment));
+  error(IO.mapVectorN<uint16_t>(
+      Annot.Strings,
+      [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));
+
+  return Error::success();
+}
+
 RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
                                        CPUType CPU) {
   assert(unsigned(EncodedReg) < 4);
index 301ef4c23344d66b244a0d2a8d80fbac6e71258f..bbaa5ed75ad2b0806f6a6bbe2a0ca4f5bf272e6f 100644 (file)
@@ -553,6 +553,12 @@ template <> void SymbolRecordImpl<UsingNamespaceSym>::map(IO &IO) {
   IO.mapRequired("Namespace", Symbol.Name);
 }
 
+template <> void SymbolRecordImpl<AnnotationSym>::map(IO &IO) {
+  IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
+  IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
+  IO.mapRequired("Strings", Symbol.Strings);
+}
+
 } // end namespace detail
 } // end namespace CodeViewYAML
 } // end namespace llvm
index a2966c43787969701e9d7006e38268f16824e747..83bc20c45da15a395d2f92c230a99d8d7cc3b9b3 100644 (file)
@@ -4,7 +4,7 @@ DbiStream:
     - Module:          unknown-symbol.yaml
       Modi:
         Records:
-          - Kind:            S_ANNOTATION
+          - Kind:            S_RESERVED1
             UnknownSym:
               Data:          123456789ABCDEF0
 ...
diff --git a/test/DebugInfo/PDB/annotation.test b/test/DebugInfo/PDB/annotation.test
new file mode 100644 (file)
index 0000000..ba6bd14
--- /dev/null
@@ -0,0 +1,88 @@
+# RUN: yaml2obj < %s > %t.obj
+# RUN: llvm-pdbutil dump --symbols %t.obj | FileCheck %s
+# RUN: llvm-readobj -codeview %t.obj | FileCheck %s --check-prefix=READOBJ
+
+# CHECK:      S_ANNOTATION [size = 20]
+# CHECK-NEXT: addr = 0001:0042
+# CHECK-NEXT: strings = [
+# CHECK-NEXT:            foo
+# CHECK-NEXT:            bar]
+
+# READOBJ:      AnnotationSym {
+# READOBJ-NEXT:   Kind: S_ANNOTATION (0x1019)
+# READOBJ-NEXT:   Offset: 0x2A
+# READOBJ-NEXT:   Segment: 0x1
+# READOBJ-NEXT:   Strings [
+# READOBJ-NEXT:     foo
+# READOBJ-NEXT:     bar
+# READOBJ-NEXT:   ]
+# READOBJ-NEXT: }
+
+--- !COFF
+header:          
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [  ]
+sections:        
+  - Name:            .text
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+    Alignment:       16
+    SectionData:     CD2C0F0B
+  - Name:            '.debug$S'
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+    Alignment:       1
+    Subsections:     
+      - !Symbols
+        Records:         
+          - Kind:            S_OBJNAME
+            ObjNameSym:      
+              Signature:       0
+              ObjectName:      'SimpleFunction.obj'
+          - Kind:            S_COMPILE3
+            Compile3Sym:     
+              Flags:           [ SecurityChecks, HotPatch ]
+              Machine:         X64
+              FrontendMajor:   19
+              FrontendMinor:   14
+              FrontendBuild:   26433
+              FrontendQFE:     0
+              BackendMajor:    19
+              BackendMinor:    14
+              BackendBuild:    26433
+              BackendQFE:      0
+              Version:         'Microsoft (R) Optimizing Compiler'
+          - Kind:            S_ANNOTATION
+            AnnotationSym:   
+              Offset: 42
+              Segment: 1
+              Strings:         
+                - foo
+                - bar
+      - !StringTable
+        Strings:
+          - 'SimpleFunction.c'
+symbols:         
+  - Name:            .text
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+    SectionDefinition: 
+      Length:          4
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      CheckSum:        2772061208
+      Number:          1
+  - Name:            '.debug$S'
+    Value:           0
+    SectionNumber:   2
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+    SectionDefinition: 
+      Length:          396
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      CheckSum:        0
+      Number:          2
+...
index 3d2547ee51a9cc617a8065f8a45782a83ad75b00..14b8cbcf45a7569a22dda13dbb5f55dfeff5d41c 100644 (file)
@@ -1,6 +1,6 @@
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.pdb %p/Inputs/unknown-symbol.yaml
 ; RUN: llvm-pdbutil pdb2yaml -minimal -module-syms -no-file-headers %t.pdb | FileCheck %s
 
-CHECK: - Kind:            S_ANNOTATION
+CHECK: - Kind:            S_RESERVED1
 CHECK:   UnknownSym:
 CHECK:     Data:          123456789ABCDEF0
index a6f374305fc8351cd639eccc670c4e2540d6a222..50d70c070d2c39de27586b62fd63e1ccfb92260c 100644 (file)
@@ -780,3 +780,12 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
   P.format(" `{0}`", UN.Name);
   return Error::success();
 }
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            AnnotationSym &Annot) {
+  AutoIndent Indent(P, 7);
+  P.formatLine("addr = {0}", formatSegmentOffset(Annot.Segment, Annot.CodeOffset));
+  P.formatLine("strings = {0}", typesetStringList(P.getIndentLevel() + 9 + 2,
+                                                   Annot.Strings));
+  return Error::success();
+}