11
11
//
12
12
// ===----------------------------------------------------------------------===//
13
13
14
+ #include " llvm/BinaryFormat/Magic.h"
14
15
#include " llvm/Object/Binary.h"
15
16
#include " llvm/Object/WindowsMachineFlag.h"
16
17
#include " llvm/Object/WindowsResource.h"
@@ -75,6 +76,14 @@ static void reportError(StringRef Input, std::error_code EC) {
75
76
reportError (Twine (Input) + " : " + EC.message () + " .\n " );
76
77
}
77
78
79
+ static void error (StringRef Input, Error EC) {
80
+ if (!EC)
81
+ return ;
82
+ handleAllErrors (std::move (EC), [&](const ErrorInfoBase &EI) {
83
+ reportError (Twine (Input) + " : " + EI.message () + " .\n " );
84
+ });
85
+ }
86
+
78
87
static void error (Error EC) {
79
88
if (!EC)
80
89
return ;
@@ -95,6 +104,16 @@ template <typename T> T error(Expected<T> EC) {
95
104
return std::move (EC.get ());
96
105
}
97
106
107
+ template <typename T> T error (StringRef Input, Expected<T> EC) {
108
+ if (!EC)
109
+ error (Input, EC.takeError ());
110
+ return std::move (EC.get ());
111
+ }
112
+
113
+ template <typename T> T error (StringRef Input, ErrorOr<T> &&EC) {
114
+ return error (Input, errorOrToExpected (std::move (EC)));
115
+ }
116
+
98
117
int main (int Argc, const char **Argv) {
99
118
InitLLVM X (Argc, Argv);
100
119
@@ -155,15 +174,17 @@ int main(int Argc, const char **Argv) {
155
174
WindowsResourceParser Parser;
156
175
157
176
for (const auto &File : InputFiles) {
158
- Expected<OwningBinary<Binary>> BinaryOrErr = createBinary (File);
159
- if (!BinaryOrErr)
160
- reportError (File, errorToErrorCode (BinaryOrErr.takeError ()));
161
-
162
- Binary &Binary = *BinaryOrErr.get ().getBinary ();
163
-
164
- WindowsResource *RF = dyn_cast<WindowsResource>(&Binary);
165
- if (!RF)
177
+ std::unique_ptr<MemoryBuffer> Buffer = error (
178
+ File, MemoryBuffer::getFileOrSTDIN (File, /* IsText=*/ false ,
179
+ /* RequiresNullTerminator=*/ false ));
180
+ file_magic Type = identify_magic (Buffer->getMemBufferRef ().getBuffer ());
181
+ if (Type != file_magic::windows_resource)
166
182
reportError (File + " : unrecognized file format.\n " );
183
+ std::unique_ptr<WindowsResource> Binary = error (
184
+ File,
185
+ WindowsResource::createWindowsResource (Buffer->getMemBufferRef ()));
186
+
187
+ WindowsResource *RF = Binary.get ();
167
188
168
189
if (Verbose) {
169
190
int EntryNumber = 0 ;
@@ -199,12 +220,14 @@ int main(int Argc, const char **Argv) {
199
220
error (FileBuffer->commit ());
200
221
201
222
if (Verbose) {
202
- Expected<OwningBinary<Binary>> BinaryOrErr = createBinary (OutputFile);
203
- if (!BinaryOrErr)
204
- reportError (OutputFile, errorToErrorCode (BinaryOrErr.takeError ()));
205
- Binary &Binary = *BinaryOrErr.get ().getBinary ();
223
+ std::unique_ptr<MemoryBuffer> Buffer =
224
+ error (OutputFile,
225
+ MemoryBuffer::getFileOrSTDIN (OutputFile, /* IsText=*/ false ,
226
+ /* RequiresNullTerminator=*/ false ));
227
+
206
228
ScopedPrinter W (errs ());
207
- W.printBinaryBlock (" Output File Raw Data" , Binary.getData ());
229
+ W.printBinaryBlock (" Output File Raw Data" ,
230
+ Buffer->getMemBufferRef ().getBuffer ());
208
231
}
209
232
210
233
return 0 ;
0 commit comments