summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-cvtres/llvm-cvtres.cpp
diff options
context:
space:
mode:
authorEric Beckmann <ecbeckmann@google.com>2017-06-09 17:34:30 +0000
committerEric Beckmann <ecbeckmann@google.com>2017-06-09 17:34:30 +0000
commitd9de6389fc705fd662b692c6fd3de640b3dc559e (patch)
tree65143a64189487991559e383a54b2b9c8fc16382 /llvm/tools/llvm-cvtres/llvm-cvtres.cpp
parent3d37b1a277da44b9a39cf4daad3b14d7b69243ec (diff)
downloadbcm5719-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.cpp73
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;
}
OpenPOWER on IntegriCloud