Skip to content

Commit 1dc2123

Browse files
committed
Share /machine: handling code with llvm-cvtres too
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 llvm-svn: 363144
1 parent ca9c3de commit 1dc2123

File tree

9 files changed

+94
-69
lines changed

9 files changed

+94
-69
lines changed

lld/COFF/Driver.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#include "DebugTypes.h"
109
#include "Driver.h"
1110
#include "Config.h"
11+
#include "DebugTypes.h"
1212
#include "ICF.h"
1313
#include "InputFiles.h"
1414
#include "MarkLive.h"
@@ -30,6 +30,7 @@
3030
#include "llvm/Object/ArchiveWriter.h"
3131
#include "llvm/Object/COFFImportFile.h"
3232
#include "llvm/Object/COFFModuleDefinition.h"
33+
#include "llvm/Object/WindowsMachineFlag.h"
3334
#include "llvm/Option/Arg.h"
3435
#include "llvm/Option/ArgList.h"
3536
#include "llvm/Option/Option.h"

lld/COFF/SymbolTable.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
#include "lld/Common/Memory.h"
1717
#include "lld/Common/Timer.h"
1818
#include "llvm/IR/LLVMContext.h"
19+
#include "llvm/Object/WindowsMachineFlag.h"
1920
#include "llvm/Support/Debug.h"
2021
#include "llvm/Support/raw_ostream.h"
21-
#include "llvm/ToolDrivers/llvm-lib/LibDriver.h"
2222
#include <utility>
2323

2424
using namespace llvm;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//===- WindowsMachineFlag.h -------------------------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// Functions for implementing the /machine: flag.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_TOOLDRIVERS_MACHINEFLAG_MACHINEFLAG_H
14+
#define LLVM_TOOLDRIVERS_MACHINEFLAG_MACHINEFLAG_H
15+
16+
namespace llvm {
17+
18+
class StringRef;
19+
namespace COFF {
20+
enum MachineTypes : unsigned;
21+
}
22+
23+
// Returns a user-readable string for ARMNT, ARM64, AMD64, I386.
24+
// Other MachineTypes values must not be passed in.
25+
StringRef machineToStr(COFF::MachineTypes MT);
26+
27+
// Maps /machine: arguments to a MachineTypes value.
28+
// Only returns ARMNT, ARM64, AMD64, I386, or IMAGE_FILE_MACHINE_UNKNOWN.
29+
COFF::MachineTypes getMachineType(StringRef S);
30+
31+
}
32+
33+
#endif

llvm/include/llvm/ToolDrivers/llvm-lib/LibDriver.h

-14
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,6 @@ template <typename T> class ArrayRef;
1919

2020
int libDriverMain(ArrayRef<const char *> ARgs);
2121

22-
23-
class StringRef;
24-
namespace COFF {
25-
enum MachineTypes : unsigned;
26-
}
27-
28-
// Returns a user-readable string for ARMNT, ARM64, AMD64, I386.
29-
// Other MachineTypes values must not be pased in.
30-
StringRef machineToStr(COFF::MachineTypes MT);
31-
32-
// Maps /machine: arguments to a MachineTypes value.
33-
// Only returns ARMNT, ARM64, AMD64, I386, or IMAGE_FILE_MACHINE_UNKNOWN.
34-
COFF::MachineTypes getMachineType(StringRef S);
35-
3622
}
3723

3824
#endif

llvm/lib/Object/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_llvm_library(LLVMObject
2222
SymbolicFile.cpp
2323
SymbolSize.cpp
2424
WasmObjectFile.cpp
25+
WindowsMachineFlag.cpp
2526
WindowsResource.cpp
2627
XCOFFObjectFile.cpp
2728

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//===- WindowsMachineFlag.cpp ---------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// Functions for implementing the /machine: flag.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "llvm/Object/WindowsMachineFlag.h"
14+
15+
#include "llvm/ADT/StringRef.h"
16+
#include "llvm/ADT/StringSwitch.h"
17+
#include "llvm/BinaryFormat/COFF.h"
18+
19+
using namespace llvm;
20+
21+
// Returns /machine's value.
22+
COFF::MachineTypes llvm::getMachineType(StringRef S) {
23+
return StringSwitch<COFF::MachineTypes>(S.lower())
24+
.Cases("x64", "amd64", COFF::IMAGE_FILE_MACHINE_AMD64)
25+
.Cases("x86", "i386", COFF::IMAGE_FILE_MACHINE_I386)
26+
.Case("arm", COFF::IMAGE_FILE_MACHINE_ARMNT)
27+
.Case("arm64", COFF::IMAGE_FILE_MACHINE_ARM64)
28+
.Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
29+
}
30+
31+
StringRef llvm::machineToStr(COFF::MachineTypes MT) {
32+
switch (MT) {
33+
case COFF::IMAGE_FILE_MACHINE_ARMNT:
34+
return "arm";
35+
case COFF::IMAGE_FILE_MACHINE_ARM64:
36+
return "arm64";
37+
case COFF::IMAGE_FILE_MACHINE_AMD64:
38+
return "x64";
39+
case COFF::IMAGE_FILE_MACHINE_I386:
40+
return "x86";
41+
default:
42+
llvm_unreachable("unknown machine type");
43+
}
44+
}

llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp

+1-25
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/Bitcode/BitcodeReader.h"
1919
#include "llvm/Object/ArchiveWriter.h"
2020
#include "llvm/Object/COFF.h"
21+
#include "llvm/Object/WindowsMachineFlag.h"
2122
#include "llvm/Option/Arg.h"
2223
#include "llvm/Option/ArgList.h"
2324
#include "llvm/Option/Option.h"
@@ -140,31 +141,6 @@ static void doList(opt::InputArgList& Args) {
140141
fatalOpenError(std::move(Err), B->getBufferIdentifier());
141142
}
142143

143-
// Returns /machine's value.
144-
COFF::MachineTypes llvm::getMachineType(StringRef S) {
145-
return StringSwitch<COFF::MachineTypes>(S.lower())
146-
.Cases("x64", "amd64", COFF::IMAGE_FILE_MACHINE_AMD64)
147-
.Cases("x86", "i386", COFF::IMAGE_FILE_MACHINE_I386)
148-
.Case("arm", COFF::IMAGE_FILE_MACHINE_ARMNT)
149-
.Case("arm64", COFF::IMAGE_FILE_MACHINE_ARM64)
150-
.Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
151-
}
152-
153-
StringRef llvm::machineToStr(COFF::MachineTypes MT) {
154-
switch (MT) {
155-
case COFF::IMAGE_FILE_MACHINE_ARMNT:
156-
return "arm";
157-
case COFF::IMAGE_FILE_MACHINE_ARM64:
158-
return "arm64";
159-
case COFF::IMAGE_FILE_MACHINE_AMD64:
160-
return "x64";
161-
case COFF::IMAGE_FILE_MACHINE_I386:
162-
return "x86";
163-
default:
164-
llvm_unreachable("unknown machine type");
165-
}
166-
}
167-
168144
int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) {
169145
BumpPtrAllocator Alloc;
170146
StringSaver Saver(Alloc);

llvm/tools/llvm-cvtres/llvm-cvtres.cpp

+11-28
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "llvm/ADT/StringSwitch.h"
1515
#include "llvm/Object/Binary.h"
16+
#include "llvm/Object/WindowsMachineFlag.h"
1617
#include "llvm/Object/WindowsResource.h"
1718
#include "llvm/Option/Arg.h"
1819
#include "llvm/Option/ArgList.h"
@@ -118,16 +119,12 @@ int main(int Argc, const char **Argv) {
118119

119120
COFF::MachineTypes MachineType;
120121

121-
if (InputArgs.hasArg(OPT_MACHINE)) {
122-
std::string MachineString = InputArgs.getLastArgValue(OPT_MACHINE).upper();
123-
MachineType = StringSwitch<COFF::MachineTypes>(MachineString)
124-
.Case("ARM", COFF::IMAGE_FILE_MACHINE_ARMNT)
125-
.Case("ARM64", COFF::IMAGE_FILE_MACHINE_ARM64)
126-
.Case("X64", COFF::IMAGE_FILE_MACHINE_AMD64)
127-
.Case("X86", COFF::IMAGE_FILE_MACHINE_I386)
128-
.Default(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
129-
if (MachineType == COFF::IMAGE_FILE_MACHINE_UNKNOWN)
130-
reportError("Unsupported machine architecture");
122+
if (opt::Arg *Arg = InputArgs.getLastArg(OPT_MACHINE)) {
123+
MachineType = getMachineType(Arg->getValue());
124+
if (MachineType == COFF::IMAGE_FILE_MACHINE_UNKNOWN) {
125+
reportError(Twine("Unsupported machine architecture ") + Arg->getValue() +
126+
"\n");
127+
}
131128
} else {
132129
if (Verbose)
133130
outs() << "Machine architecture not specified; assumed X64.\n";
@@ -142,8 +139,8 @@ int main(int Argc, const char **Argv) {
142139

143140
SmallString<128> OutputFile;
144141

145-
if (InputArgs.hasArg(OPT_OUT)) {
146-
OutputFile = InputArgs.getLastArgValue(OPT_OUT);
142+
if (opt::Arg *Arg = InputArgs.getLastArg(OPT_OUT)) {
143+
OutputFile = Arg->getValue();
147144
} else {
148145
OutputFile = sys::path::filename(StringRef(InputFiles[0]));
149146
sys::path::replace_extension(OutputFile, ".obj");
@@ -159,22 +156,8 @@ int main(int Argc, const char **Argv) {
159156
DateTimeStamp = getTime();
160157
}
161158

162-
if (Verbose) {
163-
outs() << "Machine: ";
164-
switch (MachineType) {
165-
case COFF::IMAGE_FILE_MACHINE_ARM64:
166-
outs() << "ARM64\n";
167-
break;
168-
case COFF::IMAGE_FILE_MACHINE_ARMNT:
169-
outs() << "ARM\n";
170-
break;
171-
case COFF::IMAGE_FILE_MACHINE_I386:
172-
outs() << "X86\n";
173-
break;
174-
default:
175-
outs() << "X64\n";
176-
}
177-
}
159+
if (Verbose)
160+
outs() << "Machine: " << machineToStr(MachineType) << '\n';
178161

179162
WindowsResourceParser Parser;
180163

llvm/utils/gn/secondary/llvm/lib/Object/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ static_library("Object") {
3535
"SymbolSize.cpp",
3636
"SymbolicFile.cpp",
3737
"WasmObjectFile.cpp",
38+
"WindowsMachineFlag.cpp",
3839
"WindowsResource.cpp",
3940
"XCOFFObjectFile.cpp",
4041
]

0 commit comments

Comments
 (0)