PECOFF: Use C++11 braced init list to make Version objects.

llvm-svn: 234649
This commit is contained in:
Rui Ueyama 2015-04-10 21:57:06 +00:00
parent 4a576bfd23
commit 4d57247236
4 changed files with 27 additions and 31 deletions

View File

@ -35,9 +35,8 @@ public:
PECOFFLinkingContext() { setDeadStripping(true); }
struct Version {
Version(int v1, int v2) : majorVersion(v1), minorVersion(v2) {}
int majorVersion;
int minorVersion;
int major;
int minor;
};
struct ExportDesc {

View File

@ -132,7 +132,7 @@ static bool parseMemoryOption(StringRef arg, uint64_t &reserve,
// Parse an argument for /version or /subsystem. The expected string is
// "<integer>[.<integer>]".
static bool parseVersion(StringRef arg, uint32_t &major, uint32_t &minor) {
static bool parseVersion(StringRef arg, int &major, int &minor) {
StringRef majorVersion, minorVersion;
std::tie(majorVersion, minorVersion) = arg.split('.');
if (minorVersion.empty())
@ -166,12 +166,12 @@ static llvm::COFF::WindowsSubsystem stringToWinSubsystem(StringRef str) {
// "subsystem_name[,majorOSVersion[.minorOSVersion]]".
static bool parseSubsystem(StringRef arg,
llvm::COFF::WindowsSubsystem &subsystem,
llvm::Optional<uint32_t> &major,
llvm::Optional<uint32_t> &minor, raw_ostream &diag) {
llvm::Optional<int> &major,
llvm::Optional<int> &minor, raw_ostream &diag) {
StringRef subsystemStr, osVersion;
std::tie(subsystemStr, osVersion) = arg.split(',');
if (!osVersion.empty()) {
uint32_t v1, v2;
int v1, v2;
if (!parseVersion(osVersion, v1, v2))
return false;
major = v1;
@ -1005,10 +1005,10 @@ bool WinLinkDriver::parse(int argc, const char *argv[],
}
if (auto *arg = parsedArgs->getLastArg(OPT_version)) {
uint32_t major, minor;
int major, minor;
if (!parseVersion(arg->getValue(), major, minor))
return false;
ctx.setImageVersion(PECOFFLinkingContext::Version(major, minor));
ctx.setImageVersion({major, minor});
}
// Parse /merge:<from>=<to>.
@ -1026,12 +1026,12 @@ bool WinLinkDriver::parse(int argc, const char *argv[],
// Parse /subsystem:<subsystem>[,<majorOSVersion>[.<minorOSVersion>]].
if (auto *arg = parsedArgs->getLastArg(OPT_subsystem)) {
llvm::COFF::WindowsSubsystem subsystem;
llvm::Optional<uint32_t> major, minor;
llvm::Optional<int> major, minor;
if (!parseSubsystem(arg->getValue(), subsystem, major, minor, diag))
return false;
ctx.setSubsystem(subsystem);
if (major.hasValue())
ctx.setMinOSVersion(PECOFFLinkingContext::Version(*major, *minor));
ctx.setMinOSVersion({*major, *minor});
}
// Parse /section:name,[[!]{DEKPRSW}]
@ -1143,8 +1143,7 @@ bool WinLinkDriver::parse(int argc, const char *argv[],
if (name->getBaseAddress() && ctx.getBaseAddress())
ctx.setBaseAddress(name->getBaseAddress());
} else if (auto *ver = dyn_cast<moduledef::Version>(dir)) {
ctx.setImageVersion(PECOFFLinkingContext::Version(
ver->getMajorVersion(), ver->getMinorVersion()));
ctx.setImageVersion({ver->getMajorVersion(), ver->getMinorVersion()});
} else {
llvm::dbgs() << static_cast<int>(dir->getKind()) << "\n";
llvm_unreachable("Unknown module-definition directive.\n");

View File

@ -435,18 +435,16 @@ PEHeaderChunk<PEHeader>::PEHeaderChunk(const PECOFFLinkingContext &ctx)
// The version number of the resultant executable/DLL. The number is purely
// informative, and neither the linker nor the loader won't use it. User can
// set the value using /version command line option. Default is 0.0.
PECOFFLinkingContext::Version imageVersion = ctx.getImageVersion();
_peHeader.MajorImageVersion = imageVersion.majorVersion;
_peHeader.MinorImageVersion = imageVersion.minorVersion;
_peHeader.MajorImageVersion = ctx.getImageVersion().major;
_peHeader.MinorImageVersion = ctx.getImageVersion().minor;
// The required Windows version number. This is the internal version and
// shouldn't be confused with product name. Windows 7 is version 6.1 and
// Windows 8 is 6.2, for example.
PECOFFLinkingContext::Version minOSVersion = ctx.getMinOSVersion();
_peHeader.MajorOperatingSystemVersion = minOSVersion.majorVersion;
_peHeader.MinorOperatingSystemVersion = minOSVersion.minorVersion;
_peHeader.MajorSubsystemVersion = minOSVersion.majorVersion;
_peHeader.MinorSubsystemVersion = minOSVersion.minorVersion;
_peHeader.MajorOperatingSystemVersion = ctx.getMinOSVersion().major;
_peHeader.MinorOperatingSystemVersion = ctx.getMinOSVersion().minor;
_peHeader.MajorSubsystemVersion = ctx.getMinOSVersion().major;
_peHeader.MinorSubsystemVersion = ctx.getMinOSVersion().minor;
_peHeader.Subsystem = ctx.getSubsystem();

View File

@ -45,8 +45,8 @@ TEST_F(WinLinkParserTest, Basic) {
// Unspecified flags will have default values.
EXPECT_FALSE(_ctx.isDll());
EXPECT_EQ(6, _ctx.getMinOSVersion().majorVersion);
EXPECT_EQ(0, _ctx.getMinOSVersion().minorVersion);
EXPECT_EQ(6, _ctx.getMinOSVersion().major);
EXPECT_EQ(0, _ctx.getMinOSVersion().minor);
EXPECT_EQ(0x400000U, _ctx.getBaseAddress());
EXPECT_EQ(1024 * 1024U, _ctx.getStackReserve());
EXPECT_EQ(4096U, _ctx.getStackCommit());
@ -230,28 +230,28 @@ TEST_F(WinLinkParserTest, MachineUnknown) {
TEST_F(WinLinkParserTest, MajorImageVersion) {
EXPECT_TRUE(parse("link.exe", "/version:7", "foo.o", nullptr));
EXPECT_EQ(7, _ctx.getImageVersion().majorVersion);
EXPECT_EQ(0, _ctx.getImageVersion().minorVersion);
EXPECT_EQ(7, _ctx.getImageVersion().major);
EXPECT_EQ(0, _ctx.getImageVersion().minor);
}
TEST_F(WinLinkParserTest, MajorMinorImageVersion) {
EXPECT_TRUE(parse("link.exe", "/version:72.35", "foo.o", nullptr));
EXPECT_EQ(72, _ctx.getImageVersion().majorVersion);
EXPECT_EQ(35, _ctx.getImageVersion().minorVersion);
EXPECT_EQ(72, _ctx.getImageVersion().major);
EXPECT_EQ(35, _ctx.getImageVersion().minor);
}
TEST_F(WinLinkParserTest, MinMajorOSVersion) {
EXPECT_TRUE(parse("link.exe", "/subsystem:windows,3", "foo.o", nullptr));
EXPECT_EQ(llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI, _ctx.getSubsystem());
EXPECT_EQ(3, _ctx.getMinOSVersion().majorVersion);
EXPECT_EQ(0, _ctx.getMinOSVersion().minorVersion);
EXPECT_EQ(3, _ctx.getMinOSVersion().major);
EXPECT_EQ(0, _ctx.getMinOSVersion().minor);
}
TEST_F(WinLinkParserTest, MinMajorMinorOSVersion) {
EXPECT_TRUE(parse("link.exe", "/subsystem:windows,3.1", "foo.o", nullptr));
EXPECT_EQ(llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI, _ctx.getSubsystem());
EXPECT_EQ(3, _ctx.getMinOSVersion().majorVersion);
EXPECT_EQ(1, _ctx.getMinOSVersion().minorVersion);
EXPECT_EQ(3, _ctx.getMinOSVersion().major);
EXPECT_EQ(1, _ctx.getMinOSVersion().minor);
}
TEST_F(WinLinkParserTest, Base) {