From 4679ff91863f74a45324a80fa9aed4dee48eac9a Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 24 Apr 2019 23:26:30 +0000 Subject: [PATCH] llvm-cvtres: Make new dupe resource error a bit friendlier For well-known type IDs, include the name of the type. To not duplicate the ID->name map, make llvm-readobj call this new function as well. It has slightly different output, so this also requires updating a few tests. Differential Revision: https://reviews.llvm.org/D61086 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359153 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/WindowsResource.h | 6 ++++- lib/Object/WindowsResource.cpp | 41 ++++++++++++++++++++++++----- test/tools/llvm-cvtres/combined.test | 10 +++---- test/tools/llvm-cvtres/duplicate.test | 2 +- test/tools/llvm-cvtres/object.test | 8 +++--- test/tools/llvm-readobj/coff-resources.test | 10 +++---- tools/llvm-cvtres/llvm-cvtres.cpp | 1 + tools/llvm-readobj/COFFDumper.cpp | 29 +++----------------- 8 files changed, 58 insertions(+), 49 deletions(-) diff --git a/include/llvm/Object/WindowsResource.h b/include/llvm/Object/WindowsResource.h index 4700ae8cec9..553fde2f17b 100644 --- a/include/llvm/Object/WindowsResource.h +++ b/include/llvm/Object/WindowsResource.h @@ -37,11 +37,14 @@ #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" -#include "llvm/Support/ScopedPrinter.h" #include namespace llvm { + +class raw_ostream; +class ScopedPrinter; + namespace object { class WindowsResource; @@ -230,6 +233,7 @@ Expected> writeWindowsResourceCOFF(llvm::COFF::MachineTypes MachineType, const WindowsResourceParser &Parser); +void printResourceTypeName(uint16_t TypeID, raw_ostream &OS); } // namespace object } // namespace llvm diff --git a/lib/Object/WindowsResource.cpp b/lib/Object/WindowsResource.cpp index 813b4b66e3e..bf70e75d3ab 100644 --- a/lib/Object/WindowsResource.cpp +++ b/lib/Object/WindowsResource.cpp @@ -15,6 +15,7 @@ #include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/ScopedPrinter.h" #include #include #include @@ -127,8 +128,35 @@ Error ResourceEntryRef::loadNext() { WindowsResourceParser::WindowsResourceParser() : Root(false) {} -static Error duplicateResourceError(const ResourceEntryRef& Entry, - StringRef File1, StringRef File2) { +void printResourceTypeName(uint16_t TypeID, raw_ostream &OS) { + switch (TypeID) { + case 1: OS << "CURSOR (ID 1)"; break; + case 2: OS << "BITMAP (ID 2)"; break; + case 3: OS << "ICON (ID 3)"; break; + case 4: OS << "MENU (ID 4)"; break; + case 5: OS << "DIALOG (ID 5)"; break; + case 6: OS << "STRINGTABLE (ID 6)"; break; + case 7: OS << "FONTDIR (ID 7)"; break; + case 8: OS << "FONT (ID 8)"; break; + case 9: OS << "ACCELERATOR (ID 9)"; break; + case 10: OS << "RCDATA (ID 10)"; break; + case 11: OS << "MESSAGETABLE (ID 11)"; break; + case 12: OS << "GROUP_CURSOR (ID 12)"; break; + case 14: OS << "GROUP_ICON (ID 14)"; break; + case 16: OS << "VERSIONINFO (ID 16)"; break; + case 17: OS << "DLGINCLUDE (ID 17)"; break; + case 19: OS << "PLUGPLAY (ID 19)"; break; + case 20: OS << "VXD (ID 20)"; break; + case 21: OS << "ANICURSOR (ID 21)"; break; + case 22: OS << "ANIICON (ID 22)"; break; + case 23: OS << "HTML (ID 23)"; break; + case 24: OS << "MANIFEST (ID 24)"; break; + default: OS << "ID " << TypeID; break; + } +} + +static Error makeDuplicateResourceError(const ResourceEntryRef &Entry, + StringRef File1, StringRef File2) { std::string Ret; raw_string_ostream OS(Ret); @@ -140,9 +168,8 @@ static Error duplicateResourceError(const ResourceEntryRef& Entry, if (!convertUTF16ToUTF8String(Entry.getTypeString(), UTF8)) UTF8 = "(failed conversion from UTF16)"; OS << '\"' << UTF8 << '\"'; - } else { - OS << "ID " << Entry.getTypeID(); - } + } else + printResourceTypeName(Entry.getTypeID(), OS); OS << "/name "; if (Entry.checkNameString()) { @@ -190,8 +217,8 @@ Error WindowsResourceParser::parse(WindowsResource *WR) { IsNewTypeString, IsNewNameString, Node); InputFilenames.push_back(WR->getFileName()); if (!IsNewNode) - return duplicateResourceError(Entry, InputFilenames[Node->Origin], - WR->getFileName()); + return makeDuplicateResourceError(Entry, InputFilenames[Node->Origin], + WR->getFileName()); if (IsNewTypeString) StringTable.push_back(Entry.getTypeString()); diff --git a/test/tools/llvm-cvtres/combined.test b/test/tools/llvm-cvtres/combined.test index 084a0ea0cde..b1dcf91e6d9 100644 --- a/test/tools/llvm-cvtres/combined.test +++ b/test/tools/llvm-cvtres/combined.test @@ -32,7 +32,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_BITMAP (ID 2) [ +CHECK-NEXT: Type: BITMAP (ID 2) [ CHECK-NEXT: Table Offset: 0x58 CHECK-NEXT: Number of String Entries: 2 CHECK-NEXT: Number of ID Entries: 0 @@ -61,7 +61,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_MENU (ID 4) [ +CHECK-NEXT: Type: MENU (ID 4) [ CHECK-NEXT: Table Offset: 0x78 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 1 @@ -90,7 +90,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_DIALOG (ID 5) [ +CHECK-NEXT: Type: DIALOG (ID 5) [ CHECK-NEXT: Table Offset: 0x98 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 0 @@ -107,7 +107,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_ACCELERATOR (ID 9) [ +CHECK-NEXT: Type: ACCELERATOR (ID 9) [ CHECK-NEXT: Table Offset: 0xB0 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 1 @@ -143,7 +143,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_RCDATA (ID 10) [ +CHECK-NEXT: Type: RCDATA (ID 10) [ CHECK-NEXT: Table Offset: 0xD0 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 0 diff --git a/test/tools/llvm-cvtres/duplicate.test b/test/tools/llvm-cvtres/duplicate.test index e8c4b8e95cd..bf3d2e25b87 100644 --- a/test/tools/llvm-cvtres/duplicate.test +++ b/test/tools/llvm-cvtres/duplicate.test @@ -10,7 +10,7 @@ RUN: cp %S/Inputs/id.res %t.dir/id1.res RUN: cp %S/Inputs/id.res %t.dir/id2.res RUN: not llvm-cvtres /machine:X86 %t.dir/id1.res %t.dir/id2.res 2>&1 | \ RUN: FileCheck -check-prefix=ID %s -ID: duplicate resource: type ID 6/name ID 3/language 1033, in {{.*}}id1.res and in {{.*}}id2.res +ID: duplicate resource: type STRINGTABLE (ID 6)/name ID 3/language 1033, in {{.*}}id1.res and in {{.*}}id2.res RUN: cp %S/Inputs/name.res %t.dir/name1.res RUN: cp %S/Inputs/name.res %t.dir/name2.res diff --git a/test/tools/llvm-cvtres/object.test b/test/tools/llvm-cvtres/object.test index 95522b17bd0..a12beeeb327 100644 --- a/test/tools/llvm-cvtres/object.test +++ b/test/tools/llvm-cvtres/object.test @@ -31,7 +31,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_BITMAP (ID 2) [ +CHECK-NEXT: Type: BITMAP (ID 2) [ CHECK-NEXT: Table Offset: 0x50 CHECK-NEXT: Number of String Entries: 2 CHECK-NEXT: Number of ID Entries: 0 @@ -60,7 +60,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_MENU (ID 4) [ +CHECK-NEXT: Type: MENU (ID 4) [ CHECK-NEXT: Table Offset: 0x70 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 1 @@ -89,7 +89,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_DIALOG (ID 5) [ +CHECK-NEXT: Type: DIALOG (ID 5) [ CHECK-NEXT: Table Offset: 0x90 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 0 @@ -106,7 +106,7 @@ CHECK-NEXT: Characteristics: 0 CHECK-NEXT: ] CHECK-NEXT: ] CHECK-NEXT: ] -CHECK-NEXT: Type: kRT_ACCELERATOR (ID 9) [ +CHECK-NEXT: Type: ACCELERATOR (ID 9) [ CHECK-NEXT: Table Offset: 0xA8 CHECK-NEXT: Number of String Entries: 1 CHECK-NEXT: Number of ID Entries: 1 diff --git a/test/tools/llvm-readobj/coff-resources.test b/test/tools/llvm-readobj/coff-resources.test index 589a9c968aa..e426b6e56c2 100644 --- a/test/tools/llvm-readobj/coff-resources.test +++ b/test/tools/llvm-readobj/coff-resources.test @@ -14,7 +14,7 @@ ZERO-NEXT: Total Number of Resources: 1 ZERO-NEXT: Base Table Address: 0x188 ZERO-DAG: Number of String Entries: 0 ZERO-NEXT: Number of ID Entries: 1 -ZERO-NEXT: Type: kRT_STRING (ID 6) [ +ZERO-NEXT: Type: STRINGTABLE (ID 6) [ ZERO-NEXT: Table Offset: 0x18 ZERO-NEXT: Number of String Entries: 0 ZERO-NEXT: Number of ID Entries: 1 @@ -37,7 +37,7 @@ TEST_RES-NEXT: Total Number of Resources: 7 TEST_RES-NEXT: Base Table Address: 0x1C0 TEST_RES-DAG: Number of String Entries: 0 TEST_RES-NEXT: Number of ID Entries: 4 -TEST_RES-NEXT: Type: kRT_BITMAP (ID 2) [ +TEST_RES-NEXT: Type: BITMAP (ID 2) [ TEST_RES-NEXT: Table Offset: 0x30 TEST_RES-NEXT: Number of String Entries: 2 TEST_RES-NEXT: Number of ID Entries: 0 @@ -66,7 +66,7 @@ TEST_RES-NEXT: Characteristics: 0 TEST_RES-NEXT: ] TEST_RES-NEXT: ] TEST_RES-NEXT: ] -TEST_RES-NEXT: Type: kRT_MENU (ID 4) [ +TEST_RES-NEXT: Type: MENU (ID 4) [ TEST_RES-NEXT: Table Offset: 0x50 TEST_RES-NEXT: Number of String Entries: 1 TEST_RES-NEXT: Number of ID Entries: 1 @@ -95,7 +95,7 @@ TEST_RES-NEXT: Characteristics: 0 TEST_RES-NEXT: ] TEST_RES-NEXT: ] TEST_RES-NEXT: ] -TEST_RES-NEXT: Type: kRT_DIALOG (ID 5) [ +TEST_RES-NEXT: Type: DIALOG (ID 5) [ TEST_RES-NEXT: Table Offset: 0x70 TEST_RES-NEXT: Number of String Entries: 1 TEST_RES-NEXT: Number of ID Entries: 0 @@ -112,7 +112,7 @@ TEST_RES-NEXT: Characteristics: 0 TEST_RES-NEXT: ] TEST_RES-NEXT: ] TEST_RES-NEXT: ] -TEST_RES-NEXT: Type: kRT_ACCELERATOR (ID 9) [ +TEST_RES-NEXT: Type: ACCELERATOR (ID 9) [ TEST_RES-NEXT: Table Offset: 0x88 TEST_RES-NEXT: Number of String Entries: 1 TEST_RES-NEXT: Number of ID Entries: 1 diff --git a/tools/llvm-cvtres/llvm-cvtres.cpp b/tools/llvm-cvtres/llvm-cvtres.cpp index d58a3349f9a..c6dc0e5f972 100644 --- a/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/tools/llvm-cvtres/llvm-cvtres.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Process.h" +#include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index 59c0ab87ee5..d1c8630d430 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/tools/llvm-readobj/COFFDumper.cpp @@ -43,6 +43,7 @@ #include "llvm/DebugInfo/CodeView/TypeTableCollection.h" #include "llvm/Object/COFF.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/WindowsResource.h" #include "llvm/Support/BinaryStreamReader.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" @@ -569,29 +570,6 @@ static const EnumEntry FileChecksumKindNames[] = { LLVM_READOBJ_ENUM_CLASS_ENT(FileChecksumKind, SHA256), }; -static const EnumEntry ResourceTypeNames[]{ - {"kRT_CURSOR (ID 1)", COFF::RID_Cursor}, - {"kRT_BITMAP (ID 2)", COFF::RID_Bitmap}, - {"kRT_ICON (ID 3)", COFF::RID_Icon}, - {"kRT_MENU (ID 4)", COFF::RID_Menu}, - {"kRT_DIALOG (ID 5)", COFF::RID_Dialog}, - {"kRT_STRING (ID 6)", COFF::RID_String}, - {"kRT_FONTDIR (ID 7)", COFF::RID_FontDir}, - {"kRT_FONT (ID 8)", COFF::RID_Font}, - {"kRT_ACCELERATOR (ID 9)", COFF::RID_Accelerator}, - {"kRT_RCDATA (ID 10)", COFF::RID_RCData}, - {"kRT_MESSAGETABLE (ID 11)", COFF::RID_MessageTable}, - {"kRT_GROUP_CURSOR (ID 12)", COFF::RID_Group_Cursor}, - {"kRT_GROUP_ICON (ID 14)", COFF::RID_Group_Icon}, - {"kRT_VERSION (ID 16)", COFF::RID_Version}, - {"kRT_DLGINCLUDE (ID 17)", COFF::RID_DLGInclude}, - {"kRT_PLUGPLAY (ID 19)", COFF::RID_PlugPlay}, - {"kRT_VXD (ID 20)", COFF::RID_VXD}, - {"kRT_ANICURSOR (ID 21)", COFF::RID_AniCursor}, - {"kRT_ANIICON (ID 22)", COFF::RID_AniIcon}, - {"kRT_HTML (ID 23)", COFF::RID_HTML}, - {"kRT_MANIFEST (ID 24)", COFF::RID_Manifest}}; - template static std::error_code getSymbolAuxData(const COFFObjectFile *Obj, COFFSymbolRef Symbol, @@ -1805,9 +1783,8 @@ void COFFDumper::printResourceDirectoryTable( OS << EntryNameString; } else { if (Level == "Type") { - ScopedPrinter Printer(OS); - Printer.printEnum("", Entry.Identifier.ID, - makeArrayRef(ResourceTypeNames)); + OS << ": "; + printResourceTypeName(Entry.Identifier.ID, OS); IDStr = IDStr.slice(0, IDStr.find_first_of(")", 0) + 1); } else { OS << ": (ID " << Entry.Identifier.ID << ")"; -- 2.11.0