]> granicus.if.org Git - llvm/commitdiff
[codeview] Use one byte for S_FRAMECOOKIE CookieKind and add flags byte
authorReid Kleckner <rnk@google.com>
Fri, 24 Jun 2016 17:23:49 +0000 (17:23 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 24 Jun 2016 17:23:49 +0000 (17:23 +0000)
We bailed out while printing codeview for an MSVC compiled
SemaExprCXX.cpp that used this record. The MS reference headers look
incorrect here, which is probably why we had this bug. They use a 32-bit
enum as the field type, but the actual record appears to use one byte
for the cookie kind followed by a flags byte.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273691 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

index 0c5813f35eec67dbfab0b2d5d3bf9c1e66e9bfd2..1ee203b4f8fab4e1efbb4a347ef2d13e1887542d 100644 (file)
@@ -465,7 +465,7 @@ enum class BinaryAnnotationsOpCode : uint32_t {
 };
 
 // Corresponds to CV_cookietype_e enum.
-enum class FrameCookieKind : uint32_t {
+enum class FrameCookieKind : uint8_t {
   Copy,
   XorStackPointer,
   XorFramePointer,
index 0999f211d649c120bd562297f75b9fee61b2b05f..021288e57618066231186dcaadb32da72b97d77b 100644 (file)
@@ -23,7 +23,7 @@ ArrayRef<EnumEntry<SymbolKind>> getSymbolTypeNames();
 ArrayRef<EnumEntry<uint16_t>> getRegisterNames();
 ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames();
 ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames();
-ArrayRef<EnumEntry<uint32_t>> getFrameCookieKindNames();
+ArrayRef<EnumEntry<uint8_t>> getFrameCookieKindNames();
 ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames();
 ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames();
 ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames();
index 0677f5c9cc8a4f53b6b4142e8804e3a8573dac2c..77e894fba4a9bf15a4673d2b71caebc493d11cb2 100644 (file)
@@ -1213,7 +1213,8 @@ public:
   struct Hdr {
     ulittle32_t CodeOffset;
     ulittle16_t Register;
-    ulittle32_t CookieKind;
+    uint8_t CookieKind;
+    uint8_t Flags;
   };
 
   FrameCookieSym(uint32_t RecordOffset, const Hdr *H)
index d71fec6134427063c19b728dc85514425bccb5a1..d59271b2367ec3aa54f840a675981b0b6c0342d4 100644 (file)
@@ -101,7 +101,7 @@ static const EnumEntry<uint16_t> LocalFlags[] = {
     CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
 };
 
-static const EnumEntry<uint32_t> FrameCookieKinds[] = {
+static const EnumEntry<uint8_t> FrameCookieKinds[] = {
     CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
     CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
     CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
@@ -334,7 +334,7 @@ ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames() {
 ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames() {
   return makeArrayRef(LocalFlags);
 }
-ArrayRef<EnumEntry<uint32_t>> getFrameCookieKindNames() {
+ArrayRef<EnumEntry<uint8_t>> getFrameCookieKindNames() {
   return makeArrayRef(FrameCookieKinds);
 }
 ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames() {
index c2881546c0c8321904d2e29c1b37fda46e740c40..133f9fac19f96078a7d0fc82d40f684b89558a01 100644 (file)
@@ -396,6 +396,7 @@ void CVSymbolDumperImpl::visitFrameCookieSym(SymbolKind Kind,
   W.printHex("Register", FrameCookie.Header.Register);
   W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
               getFrameCookieKindNames());
+  W.printHex("Flags", FrameCookie.Header.Flags);
 }
 
 void CVSymbolDumperImpl::visitFrameProcSym(SymbolKind Kind,