From 48865ca64d823eb5a76514deeffe235b54c86da7 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 26 Mar 2015 01:29:06 +0000 Subject: [PATCH] Make PowerOf2's constructor private. Ban conversion from integers to PowerOf2 even if explicit to make all places we create PowerOf2 instances visible. llvm-svn: 233243 --- lld/include/lld/Core/DefinedAtom.h | 5 +++-- lld/lib/Driver/DarwinLdDriver.cpp | 2 +- lld/lib/ReaderWriter/MachO/MachONormalizedFile.h | 2 +- .../MachO/MachONormalizedFileBinaryReader.cpp | 4 ++-- .../ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp | 4 ++-- lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp | 4 ++-- lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 2 +- .../MachOTests/MachONormalizedFileBinaryWriterTests.cpp | 8 ++++---- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lld/include/lld/Core/DefinedAtom.h b/lld/include/lld/Core/DefinedAtom.h index 4a654dae1e99..246a67173569 100644 --- a/lld/include/lld/Core/DefinedAtom.h +++ b/lld/include/lld/Core/DefinedAtom.h @@ -30,10 +30,11 @@ class Reference; // Once the conversion is done, this class will be removed. class PowerOf2 { public: - explicit PowerOf2(uint16_t v) : _v(v) {} + static PowerOf2 create(uint16_t v) { return PowerOf2(v); } bool operator==(const PowerOf2 &other) const { return _v == other._v; } uint16_t get() const { return 1 << _v; } private: + explicit PowerOf2(uint16_t v) : _v(v) {} uint16_t _v; }; @@ -218,7 +219,7 @@ public: }; struct Alignment { - Alignment(int p2, int m = 0) : powerOf2(p2), modulus(m) {} + Alignment(int p2, int m = 0) : powerOf2(PowerOf2::create(p2)), modulus(m) {} Alignment(PowerOf2 p2, int m = 0) : powerOf2(p2), modulus(m) {} PowerOf2 powerOf2; diff --git a/lld/lib/Driver/DarwinLdDriver.cpp b/lld/lib/Driver/DarwinLdDriver.cpp index 7bb3db3814fb..679c9b2d17c8 100644 --- a/lld/lib/Driver/DarwinLdDriver.cpp +++ b/lld/lib/Driver/DarwinLdDriver.cpp @@ -479,7 +479,7 @@ bool DarwinLdDriver::parse(int argc, const char *argv[], << alignStr << "' not a valid number\n"; return false; } - PowerOf2 align2(llvm::countTrailingZeros(alignValue)); + PowerOf2 align2 = PowerOf2::create(llvm::countTrailingZeros(alignValue)); if (!llvm::isPowerOf2_64(alignValue)) { diagnostics << "warning: alignment for '-sectalign " << segName << " " << sectName diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFile.h b/lld/lib/ReaderWriter/MachO/MachONormalizedFile.h index c1db36c31c5e..940ea639923a 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFile.h +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFile.h @@ -108,7 +108,7 @@ LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionAttr) /// can support either kind. struct Section { Section() : type(llvm::MachO::S_REGULAR), - attributes(0), alignment(0), address(0) { } + attributes(0), alignment(PowerOf2::create(0)), address(0) { } StringRef segmentName; StringRef sectionName; diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp index 5b3d942c0ff2..028c3638132a 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp @@ -297,7 +297,7 @@ readBinary(std::unique_ptr &mb, section.type = (SectionType)(read32(§->flags, isBig) & SECTION_TYPE); section.attributes = read32(§->flags, isBig) & SECTION_ATTRIBUTES; - section.alignment = PowerOf2(read32(§->align, isBig)); + section.alignment = PowerOf2::create(read32(§->align, isBig)); section.address = read64(§->addr, isBig); const uint8_t *content = (const uint8_t *)start + read32(§->offset, isBig); @@ -341,7 +341,7 @@ readBinary(std::unique_ptr &mb, SECTION_TYPE); section.attributes = read32((const uint8_t *)§->flags, isBig) & SECTION_ATTRIBUTES; - section.alignment = PowerOf2(read32(§->align, isBig)); + section.alignment = PowerOf2::create(read32(§->align, isBig)); section.address = read32(§->addr, isBig); const uint8_t *content = (const uint8_t *)start + read32(§->offset, isBig); diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp index 3f8a944494ef..15bdb0aa0771 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp @@ -67,9 +67,9 @@ struct SectionInfo { SectionInfo::SectionInfo(StringRef sg, StringRef sct, SectionType t, const MachOLinkingContext &ctxt, uint32_t attrs) : segmentName(sg), sectionName(sct), type(t), attributes(attrs), - address(0), size(0), alignment(0), + address(0), size(0), alignment(PowerOf2::create(0)), normalizedSectionIndex(0), finalSectionIndex(0) { - PowerOf2 align(0); + PowerOf2 align = PowerOf2::create(0); if (ctxt.sectionAligned(segmentName, sectionName, align)) { alignment = align; } diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp index 3635c62aa7c5..79eefd325731 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp @@ -61,7 +61,7 @@ struct ScalarTraits { static StringRef input(StringRef scalar, void*, lld::PowerOf2 &result) { uint32_t value; scalar.getAsInteger(10, value); - result = lld::PowerOf2(value); + result = lld::PowerOf2::create(value); return StringRef(); } static bool mustQuote(StringRef) { return false; } @@ -290,7 +290,7 @@ struct MappingTraits
{ io.mapRequired("section", sect.sectionName); io.mapRequired("type", sect.type); io.mapOptional("attributes", sect.attributes); - io.mapOptional("alignment", sect.alignment, lld::PowerOf2(0)); + io.mapOptional("alignment", sect.alignment, lld::PowerOf2::create(0)); io.mapRequired("address", sect.address); if (sect.type == llvm::MachO::S_ZEROFILL) { // S_ZEROFILL sections use "size:" instead of "content:" diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index cfd335508665..e2766ced90c5 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -509,7 +509,7 @@ template <> struct ScalarTraits { if (scalar.getAsInteger(0, power)) { return "malformed alignment power"; } - value.powerOf2 = PowerOf2(llvm::Log2_64(power)); + value.powerOf2 = PowerOf2::create(llvm::Log2_64(power)); if (value.modulus >= power) { return "malformed alignment, modulus too large for power"; } diff --git a/lld/unittests/MachOTests/MachONormalizedFileBinaryWriterTests.cpp b/lld/unittests/MachOTests/MachONormalizedFileBinaryWriterTests.cpp index 528c908c90e1..d7a032775f58 100644 --- a/lld/unittests/MachOTests/MachONormalizedFileBinaryWriterTests.cpp +++ b/lld/unittests/MachOTests/MachONormalizedFileBinaryWriterTests.cpp @@ -123,7 +123,7 @@ TEST(BinaryWriterTest, obj_relocs_x86_64) { text.type = S_REGULAR; text.attributes = SectionAttr(S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS); - text.alignment = lld::PowerOf2(4); + text.alignment = lld::PowerOf2::create(4); text.address = 0; const uint8_t textBytes[] = { 0xe8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, @@ -240,7 +240,7 @@ TEST(BinaryWriterTest, obj_relocs_x86) { text.type = S_REGULAR; text.attributes = SectionAttr(S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS); - text.alignment = lld::PowerOf2(4); + text.alignment = lld::PowerOf2::create(4); text.address = 0; const uint8_t textBytes[] = { 0xe8, 0xfb, 0xff, 0xff, 0xff, 0xa1, 0x00, 0x00, @@ -350,7 +350,7 @@ TEST(BinaryWriterTest, obj_relocs_armv7) { text.type = S_REGULAR; text.attributes = SectionAttr(S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS); - text.alignment = lld::PowerOf2(2); + text.alignment = lld::PowerOf2::create(2); text.address = 0; const uint8_t textBytes[] = { 0xff, 0xf7, 0xfe, 0xef, 0x40, 0xf2, 0x05, 0x01, @@ -479,7 +479,7 @@ TEST(BinaryWriterTest, obj_relocs_ppc) { text.type = S_REGULAR; text.attributes = SectionAttr(S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS); - text.alignment = lld::PowerOf2(2); + text.alignment = lld::PowerOf2::create(2); text.address = 0; const uint8_t textBytes[] = { 0x48, 0x00, 0x00, 0x01, 0x40, 0x82, 0xff, 0xfc,