]> granicus.if.org Git - llvm/commitdiff
Share /machine: handling code with llvm-cvtres too
authorNico Weber <nicolasweber@gmx.de>
Wed, 12 Jun 2019 11:32:43 +0000 (11:32 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 12 Jun 2019 11:32:43 +0000 (11:32 +0000)
r363016 let lld-link and llvm-lib share the /machine: parsing code.
This lets llvm-cvtres share it as well.

Making llvm-cvtres depend on llvm-lib seemed a bit strange (it doesn't
need llvm-lib's dependencies on BinaryFormat and BitReader) and I
couldn't find a good place to put this code. Since it's just a few
lines, put it in lib/Object for now.

Differential Revision: https://reviews.llvm.org/D63120

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363144 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/WindowsMachineFlag.h [new file with mode: 0644]
include/llvm/ToolDrivers/llvm-lib/LibDriver.h
lib/Object/CMakeLists.txt
lib/Object/WindowsMachineFlag.cpp [new file with mode: 0644]
lib/ToolDrivers/llvm-lib/LibDriver.cpp
tools/llvm-cvtres/llvm-cvtres.cpp
utils/gn/secondary/llvm/lib/Object/BUILD.gn

diff --git a/include/llvm/Object/WindowsMachineFlag.h b/include/llvm/Object/WindowsMachineFlag.h
new file mode 100644 (file)
index 0000000..acc6afc
--- /dev/null
@@ -0,0 +1,33 @@
+//===- WindowsMachineFlag.h -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Functions for implementing the /machine: flag.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLDRIVERS_MACHINEFLAG_MACHINEFLAG_H
+#define LLVM_TOOLDRIVERS_MACHINEFLAG_MACHINEFLAG_H
+
+namespace llvm {
+
+class StringRef;
+namespace COFF {
+enum MachineTypes : unsigned;
+}
+
+// Returns a user-readable string for ARMNT, ARM64, AMD64, I386.
+// Other MachineTypes values must not be passed in.
+StringRef machineToStr(COFF::MachineTypes MT);
+
+// Maps /machine: arguments to a MachineTypes value.
+// Only returns ARMNT, ARM64, AMD64, I386, or IMAGE_FILE_MACHINE_UNKNOWN.
+COFF::MachineTypes getMachineType(StringRef S);
+
+}
+
+#endif
index 9fdcdd808e2472d173d5a8552dd49e75b948db40..23a2fc348a892728217505d481580eb632fab5e0 100644 (file)
@@ -19,20 +19,6 @@ template <typename T> class ArrayRef;
 
 int libDriverMain(ArrayRef<const char *> ARgs);
 
-
-class StringRef;
-namespace COFF {
-enum MachineTypes : unsigned;
-}
-
-// Returns a user-readable string for ARMNT, ARM64, AMD64, I386.
-// Other MachineTypes values must not be pased in.
-StringRef machineToStr(COFF::MachineTypes MT);
-
-// Maps /machine: arguments to a MachineTypes value.
-// Only returns ARMNT, ARM64, AMD64, I386, or IMAGE_FILE_MACHINE_UNKNOWN.
-COFF::MachineTypes getMachineType(StringRef S);
-
 }
 
 #endif
index 242ae7ef3aa3bdbdfa9caed90821e6dc496f2dc5..e3ed6405d14293163b2eda278c5b250d6873e9ac 100644 (file)
@@ -22,6 +22,7 @@ add_llvm_library(LLVMObject
   SymbolicFile.cpp
   SymbolSize.cpp
   WasmObjectFile.cpp
+  WindowsMachineFlag.cpp
   WindowsResource.cpp
   XCOFFObjectFile.cpp
 
diff --git a/lib/Object/WindowsMachineFlag.cpp b/lib/Object/WindowsMachineFlag.cpp
new file mode 100644 (file)
index 0000000..f7f2b20
--- /dev/null
@@ -0,0 +1,44 @@
+//===- WindowsMachineFlag.cpp ---------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Functions for implementing the /machine: flag.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/WindowsMachineFlag.h"
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/BinaryFormat/COFF.h"
+
+using namespace llvm;
+
+// Returns /machine's value.
+COFF::MachineTypes llvm::getMachineType(StringRef S) {
+  return StringSwitch<COFF::MachineTypes>(S.lower())
+      .Cases("x64", "amd64", COFF::IMAGE_FILE_MACHINE_AMD64)
+      .Cases("x86", "i386", COFF::IMAGE_FILE_MACHINE_I386)
+      .Case("arm", COFF::IMAGE_FILE_MACHINE_ARMNT)
+      .Case("arm64", COFF::IMAGE_FILE_MACHINE_ARM64)
+      .Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
+}
+
+StringRef llvm::machineToStr(COFF::MachineTypes MT) {
+  switch (MT) {
+  case COFF::IMAGE_FILE_MACHINE_ARMNT:
+    return "arm";
+  case COFF::IMAGE_FILE_MACHINE_ARM64:
+    return "arm64";
+  case COFF::IMAGE_FILE_MACHINE_AMD64:
+    return "x64";
+  case COFF::IMAGE_FILE_MACHINE_I386:
+    return "x86";
+  default:
+    llvm_unreachable("unknown machine type");
+  }
+}
index 852a977e795f4ba8fb51d1e7d7cd2429cfffb4d5..1201b2809c3e0be3a8b969802bc8dc680a92ac45 100644 (file)
@@ -18,6 +18,7 @@
 #include "llvm/Bitcode/BitcodeReader.h"
 #include "llvm/Object/ArchiveWriter.h"
 #include "llvm/Object/COFF.h"
+#include "llvm/Object/WindowsMachineFlag.h"
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
@@ -140,31 +141,6 @@ static void doList(opt::InputArgList& Args) {
   fatalOpenError(std::move(Err), B->getBufferIdentifier());
 }
 
-// Returns /machine's value.
-COFF::MachineTypes llvm::getMachineType(StringRef S) {
-  return StringSwitch<COFF::MachineTypes>(S.lower())
-      .Cases("x64", "amd64", COFF::IMAGE_FILE_MACHINE_AMD64)
-      .Cases("x86", "i386", COFF::IMAGE_FILE_MACHINE_I386)
-      .Case("arm", COFF::IMAGE_FILE_MACHINE_ARMNT)
-      .Case("arm64", COFF::IMAGE_FILE_MACHINE_ARM64)
-      .Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
-}
-
-StringRef llvm::machineToStr(COFF::MachineTypes MT) {
-  switch (MT) {
-  case COFF::IMAGE_FILE_MACHINE_ARMNT:
-    return "arm";
-  case COFF::IMAGE_FILE_MACHINE_ARM64:
-    return "arm64";
-  case COFF::IMAGE_FILE_MACHINE_AMD64:
-    return "x64";
-  case COFF::IMAGE_FILE_MACHINE_I386:
-    return "x86";
-  default:
-    llvm_unreachable("unknown machine type");
-  }
-}
-
 int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) {
   BumpPtrAllocator Alloc;
   StringSaver Saver(Alloc);
index c2e46f0f680054ab4136a8517d3918a481984d05..1322da47a7059b3f9e8ee1def5997ff594889c8c 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Object/Binary.h"
+#include "llvm/Object/WindowsMachineFlag.h"
 #include "llvm/Object/WindowsResource.h"
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
@@ -118,16 +119,12 @@ int main(int Argc, const char **Argv) {
 
   COFF::MachineTypes MachineType;
 
-  if (InputArgs.hasArg(OPT_MACHINE)) {
-    std::string MachineString = InputArgs.getLastArgValue(OPT_MACHINE).upper();
-    MachineType = StringSwitch<COFF::MachineTypes>(MachineString)
-                      .Case("ARM", COFF::IMAGE_FILE_MACHINE_ARMNT)
-                      .Case("ARM64", COFF::IMAGE_FILE_MACHINE_ARM64)
-                      .Case("X64", COFF::IMAGE_FILE_MACHINE_AMD64)
-                      .Case("X86", COFF::IMAGE_FILE_MACHINE_I386)
-                      .Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
-    if (MachineType == COFF::IMAGE_FILE_MACHINE_UNKNOWN)
-      reportError("Unsupported machine architecture");
+  if (opt::Arg *Arg = InputArgs.getLastArg(OPT_MACHINE)) {
+    MachineType = getMachineType(Arg->getValue());
+    if (MachineType == COFF::IMAGE_FILE_MACHINE_UNKNOWN) {
+      reportError(Twine("Unsupported machine architecture ") + Arg->getValue() +
+                  "\n");
+    }
   } else {
     if (Verbose)
       outs() << "Machine architecture not specified; assumed X64.\n";
@@ -142,8 +139,8 @@ int main(int Argc, const char **Argv) {
 
   SmallString<128> OutputFile;
 
-  if (InputArgs.hasArg(OPT_OUT)) {
-    OutputFile = InputArgs.getLastArgValue(OPT_OUT);
+  if (opt::Arg *Arg = InputArgs.getLastArg(OPT_OUT)) {
+    OutputFile = Arg->getValue();
   } else {
     OutputFile = sys::path::filename(StringRef(InputFiles[0]));
     sys::path::replace_extension(OutputFile, ".obj");
@@ -159,22 +156,8 @@ int main(int Argc, const char **Argv) {
     DateTimeStamp = getTime();
   }
 
-  if (Verbose) {
-    outs() << "Machine: ";
-    switch (MachineType) {
-    case COFF::IMAGE_FILE_MACHINE_ARM64:
-      outs() << "ARM64\n";
-      break;
-    case COFF::IMAGE_FILE_MACHINE_ARMNT:
-      outs() << "ARM\n";
-      break;
-    case COFF::IMAGE_FILE_MACHINE_I386:
-      outs() << "X86\n";
-      break;
-    default:
-      outs() << "X64\n";
-    }
-  }
+  if (Verbose)
+    outs() << "Machine: " << machineToStr(MachineType) << '\n';
 
   WindowsResourceParser Parser;
 
index 67dde89d6cde1dd3fbb454ede4573499c2d5176c..9f4477a084aeb09411bd9c89b1ed57a39c88072e 100644 (file)
@@ -35,6 +35,7 @@ static_library("Object") {
     "SymbolSize.cpp",
     "SymbolicFile.cpp",
     "WasmObjectFile.cpp",
+    "WindowsMachineFlag.cpp",
     "WindowsResource.cpp",
     "XCOFFObjectFile.cpp",
   ]