diff options
author | Eric Beckmann <ecbeckmann@google.com> | 2017-06-09 17:34:30 +0000 |
---|---|---|
committer | Eric Beckmann <ecbeckmann@google.com> | 2017-06-09 17:34:30 +0000 |
commit | d9de6389fc705fd662b692c6fd3de640b3dc559e (patch) | |
tree | 65143a64189487991559e383a54b2b9c8fc16382 /llvm/tools/llvm-cvtres/llvm-cvtres.cpp | |
parent | 3d37b1a277da44b9a39cf4daad3b14d7b69243ec (diff) | |
download | bcm5719-llvm-d9de6389fc705fd662b692c6fd3de640b3dc559e.tar.gz bcm5719-llvm-d9de6389fc705fd662b692c6fd3de640b3dc559e.zip |
Implement COFF emission for parsed Windows Resource ( .res) files.
Summary: Add the WindowsResourceCOFFWriter class for producing the final COFF after all parsing is done.
Reviewers: hiraditya!, zturner, ruiu
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D34020
llvm-svn: 305092
Diffstat (limited to 'llvm/tools/llvm-cvtres/llvm-cvtres.cpp')
-rw-r--r-- | llvm/tools/llvm-cvtres/llvm-cvtres.cpp | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp index 95a6623b44e..eaba02c16f3 100644 --- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp @@ -112,20 +112,23 @@ int main(int argc_, const char *argv_[]) { return 0; } - machine Machine; + bool Verbose = InputArgs.hasArg(OPT_VERBOSE); + + Machine MachineType; if (InputArgs.hasArg(OPT_MACHINE)) { std::string MachineString = InputArgs.getLastArgValue(OPT_MACHINE).upper(); - Machine = StringSwitch<machine>(MachineString) - .Case("ARM", machine::ARM) - .Case("X64", machine::X64) - .Case("X86", machine::X86) - .Default(machine::UNKNOWN); - if (Machine == machine::UNKNOWN) + MachineType = StringSwitch<Machine>(MachineString) + .Case("ARM", Machine::ARM) + .Case("X64", Machine::X64) + .Case("X86", Machine::X86) + .Default(Machine::UNKNOWN); + if (MachineType == Machine::UNKNOWN) reportError("Unsupported machine architecture"); } else { - outs() << "Machine architecture not specified; assumed X64.\n"; - Machine = machine::X64; + if (Verbose) + outs() << "Machine architecture not specified; assumed X64.\n"; + MachineType = Machine::X64; } std::vector<std::string> InputFiles = InputArgs.getAllArgValues(OPT_INPUT); @@ -139,20 +142,22 @@ int main(int argc_, const char *argv_[]) { if (InputArgs.hasArg(OPT_OUT)) { OutputFile = InputArgs.getLastArgValue(OPT_OUT); } else { - OutputFile = StringRef(InputFiles[0]); + OutputFile = llvm::sys::path::filename(StringRef(InputFiles[0])); llvm::sys::path::replace_extension(OutputFile, ".obj"); } - outs() << "Machine: "; - switch (Machine) { - case machine::ARM: - outs() << "ARM\n"; - break; - case machine::X86: - outs() << "X86\n"; - break; - default: - outs() << "X64\n"; + if (Verbose) { + outs() << "Machine: "; + switch (MachineType) { + case Machine::ARM: + outs() << "ARM\n"; + break; + case Machine::X86: + outs() << "X86\n"; + break; + default: + outs() << "X64\n"; + } } WindowsResourceParser Parser; @@ -169,22 +174,28 @@ int main(int argc_, const char *argv_[]) { if (!RF) reportError(File + ": unrecognized file format.\n"); - int EntryNumber = 0; - Expected<ResourceEntryRef> EntryOrErr = RF->getHeadEntry(); - if (!EntryOrErr) - error(EntryOrErr.takeError()); - ResourceEntryRef Entry = EntryOrErr.get(); - bool End = false; - while (!End) { - error(Entry.moveNext(End)); - EntryNumber++; + if (Verbose) { + int EntryNumber = 0; + Expected<ResourceEntryRef> EntryOrErr = RF->getHeadEntry(); + if (!EntryOrErr) + error(EntryOrErr.takeError()); + ResourceEntryRef Entry = EntryOrErr.get(); + bool End = false; + while (!End) { + error(Entry.moveNext(End)); + EntryNumber++; + } + outs() << "Number of resources: " << EntryNumber << "\n"; } - outs() << "Number of resources: " << EntryNumber << "\n"; error(Parser.parse(RF)); } - Parser.printTree(); + if (Verbose) + Parser.printTree(); + + error( + llvm::object::writeWindowsResourceCOFF(OutputFile, MachineType, Parser)); return 0; } |