diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-07-05 14:21:36 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-07-05 14:21:36 +0000 |
| commit | 1a82d4c088707c791c792f6822f611b47a12bdfe (patch) | |
| tree | 7c411f9b5d807f7f204fdd16965d8925a82b6d18 /unittests | |
| parent | 3a0822f094b578157263e04114075ad7df81db41 (diff) | |
Diffstat (limited to 'unittests')
| -rw-r--r-- | unittests/ADT/APIntTest.cpp | 166 | ||||
| -rw-r--r-- | unittests/ADT/APSIntTest.cpp | 17 | ||||
| -rw-r--r-- | unittests/ADT/DenseMapTest.cpp | 25 | ||||
| -rw-r--r-- | unittests/ADT/TripleTest.cpp | 30 | ||||
| -rw-r--r-- | unittests/AsmParser/AsmParserTest.cpp | 20 | ||||
| -rw-r--r-- | unittests/CodeGen/DIEHashTest.cpp | 481 | ||||
| -rw-r--r-- | unittests/ExecutionEngine/Orc/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp | 302 | ||||
| -rw-r--r-- | unittests/IR/IRBuilderTest.cpp | 35 | ||||
| -rw-r--r-- | unittests/IR/MetadataTest.cpp | 47 | ||||
| -rw-r--r-- | unittests/IR/ValueTest.cpp | 69 | ||||
| -rw-r--r-- | unittests/Option/OptionParsingTest.cpp | 137 | ||||
| -rw-r--r-- | unittests/ProfileData/InstrProfTest.cpp | 6 | ||||
| -rw-r--r-- | unittests/Transforms/Utils/Cloning.cpp | 35 |
14 files changed, 1073 insertions, 298 deletions
diff --git a/unittests/ADT/APIntTest.cpp b/unittests/ADT/APIntTest.cpp index e4398f0f669c..ffba7b163369 100644 --- a/unittests/ADT/APIntTest.cpp +++ b/unittests/ADT/APIntTest.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/APInt.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" +#include <array> #include <ostream> using namespace llvm; @@ -215,6 +216,171 @@ TEST(APIntTest, i1) { } } +TEST(APIntTest, compare) { + std::array<APInt, 5> testVals{{ + APInt{16, 2}, + APInt{16, 1}, + APInt{16, 0}, + APInt{16, (uint64_t)-1, true}, + APInt{16, (uint64_t)-2, true}, + }}; + + for (auto &arg1 : testVals) + for (auto &arg2 : testVals) { + auto uv1 = arg1.getZExtValue(); + auto uv2 = arg2.getZExtValue(); + auto sv1 = arg1.getSExtValue(); + auto sv2 = arg2.getSExtValue(); + + EXPECT_EQ(uv1 < uv2, arg1.ult(arg2)); + EXPECT_EQ(uv1 <= uv2, arg1.ule(arg2)); + EXPECT_EQ(uv1 > uv2, arg1.ugt(arg2)); + EXPECT_EQ(uv1 >= uv2, arg1.uge(arg2)); + + EXPECT_EQ(sv1 < sv2, arg1.slt(arg2)); + EXPECT_EQ(sv1 <= sv2, arg1.sle(arg2)); + EXPECT_EQ(sv1 > sv2, arg1.sgt(arg2)); + EXPECT_EQ(sv1 >= sv2, arg1.sge(arg2)); + + EXPECT_EQ(uv1 < uv2, arg1.ult(uv2)); + EXPECT_EQ(uv1 <= uv2, arg1.ule(uv2)); + EXPECT_EQ(uv1 > uv2, arg1.ugt(uv2)); + EXPECT_EQ(uv1 >= uv2, arg1.uge(uv2)); + + EXPECT_EQ(sv1 < sv2, arg1.slt(sv2)); + EXPECT_EQ(sv1 <= sv2, arg1.sle(sv2)); + EXPECT_EQ(sv1 > sv2, arg1.sgt(sv2)); + EXPECT_EQ(sv1 >= sv2, arg1.sge(sv2)); + } +} + +TEST(APIntTest, compareWithRawIntegers) { + EXPECT_TRUE(!APInt(8, 1).uge(256)); + EXPECT_TRUE(!APInt(8, 1).ugt(256)); + EXPECT_TRUE( APInt(8, 1).ule(256)); + EXPECT_TRUE( APInt(8, 1).ult(256)); + EXPECT_TRUE(!APInt(8, 1).sge(256)); + EXPECT_TRUE(!APInt(8, 1).sgt(256)); + EXPECT_TRUE( APInt(8, 1).sle(256)); + EXPECT_TRUE( APInt(8, 1).slt(256)); + EXPECT_TRUE(!(APInt(8, 0) == 256)); + EXPECT_TRUE( APInt(8, 0) != 256); + EXPECT_TRUE(!(APInt(8, 1) == 256)); + EXPECT_TRUE( APInt(8, 1) != 256); + + auto uint64max = UINT64_MAX; + auto int64max = INT64_MAX; + auto int64min = INT64_MIN; + + auto u64 = APInt{128, uint64max}; + auto s64 = APInt{128, static_cast<uint64_t>(int64max), true}; + auto big = u64 + 1; + + EXPECT_TRUE( u64.uge(uint64max)); + EXPECT_TRUE(!u64.ugt(uint64max)); + EXPECT_TRUE( u64.ule(uint64max)); + EXPECT_TRUE(!u64.ult(uint64max)); + EXPECT_TRUE( u64.sge(int64max)); + EXPECT_TRUE( u64.sgt(int64max)); + EXPECT_TRUE(!u64.sle(int64max)); + EXPECT_TRUE(!u64.slt(int64max)); + EXPECT_TRUE( u64.sge(int64min)); + EXPECT_TRUE( u64.sgt(int64min)); + EXPECT_TRUE(!u64.sle(int64min)); + EXPECT_TRUE(!u64.slt(int64min)); + + EXPECT_TRUE(u64 == uint64max); + EXPECT_TRUE(u64 != int64max); + EXPECT_TRUE(u64 != int64min); + + EXPECT_TRUE(!s64.uge(uint64max)); + EXPECT_TRUE(!s64.ugt(uint64max)); + EXPECT_TRUE( s64.ule(uint64max)); + EXPECT_TRUE( s64.ult(uint64max)); + EXPECT_TRUE( s64.sge(int64max)); + EXPECT_TRUE(!s64.sgt(int64max)); + EXPECT_TRUE( s64.sle(int64max)); + EXPECT_TRUE(!s64.slt(int64max)); + EXPECT_TRUE( s64.sge(int64min)); + EXPECT_TRUE( s64.sgt(int64min)); + EXPECT_TRUE(!s64.sle(int64min)); + EXPECT_TRUE(!s64.slt(int64min)); + + EXPECT_TRUE(s64 != uint64max); + EXPECT_TRUE(s64 == int64max); + EXPECT_TRUE(s64 != int64min); + + EXPECT_TRUE( big.uge(uint64max)); + EXPECT_TRUE( big.ugt(uint64max)); + EXPECT_TRUE(!big.ule(uint64max)); + EXPECT_TRUE(!big.ult(uint64max)); + EXPECT_TRUE( big.sge(int64max)); + EXPECT_TRUE( big.sgt(int64max)); + EXPECT_TRUE(!big.sle(int64max)); + EXPECT_TRUE(!big.slt(int64max)); + EXPECT_TRUE( big.sge(int64min)); + EXPECT_TRUE( big.sgt(int64min)); + EXPECT_TRUE(!big.sle(int64min)); + EXPECT_TRUE(!big.slt(int64min)); + + EXPECT_TRUE(big != uint64max); + EXPECT_TRUE(big != int64max); + EXPECT_TRUE(big != int64min); +} + +TEST(APIntTest, compareWithInt64Min) { + int64_t edge = INT64_MIN; + int64_t edgeP1 = edge + 1; + int64_t edgeM1 = INT64_MAX; + auto a = APInt{64, static_cast<uint64_t>(edge), true}; + + EXPECT_TRUE(!a.slt(edge)); + EXPECT_TRUE( a.sle(edge)); + EXPECT_TRUE(!a.sgt(edge)); + EXPECT_TRUE( a.sge(edge)); + EXPECT_TRUE( a.slt(edgeP1)); + EXPECT_TRUE( a.sle(edgeP1)); + EXPECT_TRUE(!a.sgt(edgeP1)); + EXPECT_TRUE(!a.sge(edgeP1)); + EXPECT_TRUE( a.slt(edgeM1)); + EXPECT_TRUE( a.sle(edgeM1)); + EXPECT_TRUE(!a.sgt(edgeM1)); + EXPECT_TRUE(!a.sge(edgeM1)); +} + +TEST(APIntTest, compareWithHalfInt64Max) { + uint64_t edge = 0x4000000000000000; + uint64_t edgeP1 = edge + 1; + uint64_t edgeM1 = edge - 1; + auto a = APInt{64, edge}; + + EXPECT_TRUE(!a.ult(edge)); + EXPECT_TRUE( a.ule(edge)); + EXPECT_TRUE(!a.ugt(edge)); + EXPECT_TRUE( a.uge(edge)); + EXPECT_TRUE( a.ult(edgeP1)); + EXPECT_TRUE( a.ule(edgeP1)); + EXPECT_TRUE(!a.ugt(edgeP1)); + EXPECT_TRUE(!a.uge(edgeP1)); + EXPECT_TRUE(!a.ult(edgeM1)); + EXPECT_TRUE(!a.ule(edgeM1)); + EXPECT_TRUE( a.ugt(edgeM1)); + EXPECT_TRUE( a.uge(edgeM1)); + + EXPECT_TRUE(!a.slt(edge)); + EXPECT_TRUE( a.sle(edge)); + EXPECT_TRUE(!a.sgt(edge)); + EXPECT_TRUE( a.sge(edge)); + EXPECT_TRUE( a.slt(edgeP1)); + EXPECT_TRUE( a.sle(edgeP1)); + EXPECT_TRUE(!a.sgt(edgeP1)); + EXPECT_TRUE(!a.sge(edgeP1)); + EXPECT_TRUE(!a.slt(edgeM1)); + EXPECT_TRUE(!a.sle(edgeM1)); + EXPECT_TRUE( a.sgt(edgeM1)); + EXPECT_TRUE( a.sge(edgeM1)); +} + // Tests different div/rem varaints using scheme (a * b + c) / a void testDiv(APInt a, APInt b, APInt c) { diff --git a/unittests/ADT/APSIntTest.cpp b/unittests/ADT/APSIntTest.cpp index 5e4e87440bdb..a9b3071d1388 100644 --- a/unittests/ADT/APSIntTest.cpp +++ b/unittests/ADT/APSIntTest.cpp @@ -143,4 +143,21 @@ TEST(APSIntTest, compareValues) { EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0); } +TEST(APSIntTest, FromString) { + EXPECT_EQ(APSInt("1").getExtValue(), 1); + EXPECT_EQ(APSInt("-1").getExtValue(), -1); + EXPECT_EQ(APSInt("0").getExtValue(), 0); + EXPECT_EQ(APSInt("56789").getExtValue(), 56789); + EXPECT_EQ(APSInt("-1234").getExtValue(), -1234); } + +#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) + +TEST(APSIntTest, StringDeath) { + EXPECT_DEATH(APSInt(""), "Invalid string length"); + EXPECT_DEATH(APSInt("1a"), "Invalid character in digit string"); +} + +#endif + +} // end anonymous namespace diff --git a/unittests/ADT/DenseMapTest.cpp b/unittests/ADT/DenseMapTest.cpp index 97807771725d..2c6fe3588327 100644 --- a/unittests/ADT/DenseMapTest.cpp +++ b/unittests/ADT/DenseMapTest.cpp @@ -323,6 +323,31 @@ TYPED_TEST(DenseMapTest, ConstIteratorTest) { EXPECT_TRUE(cit == cit2); } +// Make sure DenseMap works with StringRef keys. +TEST(DenseMapCustomTest, StringRefTest) { + DenseMap<StringRef, int> M; + + M["a"] = 1; + M["b"] = 2; + M["c"] = 3; + + EXPECT_EQ(3u, M.size()); + EXPECT_EQ(1, M.lookup("a")); + EXPECT_EQ(2, M.lookup("b")); + EXPECT_EQ(3, M.lookup("c")); + + EXPECT_EQ(0, M.lookup("q")); + + // Test the empty string, spelled various ways. + EXPECT_EQ(0, M.lookup("")); + EXPECT_EQ(0, M.lookup(StringRef())); + EXPECT_EQ(0, M.lookup(StringRef("a", 0))); + M[""] = 42; + EXPECT_EQ(42, M.lookup("")); + EXPECT_EQ(42, M.lookup(StringRef())); + EXPECT_EQ(42, M.lookup(StringRef("a", 0))); +} + // Key traits that allows lookup with either an unsigned or char* key; // In the latter case, "a" == 0, "b" == 1 and so on. struct TestDenseMapInfo { diff --git a/unittests/ADT/TripleTest.cpp b/unittests/ADT/TripleTest.cpp index 23a9128a8f27..d50768412d74 100644 --- a/unittests/ADT/TripleTest.cpp +++ b/unittests/ADT/TripleTest.cpp @@ -182,6 +182,18 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::CloudABI, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("wasm32-unknown-unknown"); + EXPECT_EQ(Triple::wasm32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::UnknownOS, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + + T = Triple("wasm64-unknown-unknown"); + EXPECT_EQ(Triple::wasm64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::UnknownOS, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("huh"); EXPECT_EQ(Triple::UnknownArch, T.getArch()); } @@ -439,6 +451,16 @@ TEST(TripleTest, BitWidthPredicates) { EXPECT_FALSE(T.isArch16Bit()); EXPECT_FALSE(T.isArch32Bit()); EXPECT_TRUE(T.isArch64Bit()); + + T.setArch(Triple::wasm32); + EXPECT_FALSE(T.isArch16Bit()); + EXPECT_TRUE(T.isArch32Bit()); + EXPECT_FALSE(T.isArch64Bit()); + + T.setArch(Triple::wasm64); + EXPECT_FALSE(T.isArch16Bit()); + EXPECT_FALSE(T.isArch32Bit()); + EXPECT_TRUE(T.isArch64Bit()); } TEST(TripleTest, BitWidthArchVariants) { @@ -521,6 +543,14 @@ TEST(TripleTest, BitWidthArchVariants) { T.setArch(Triple::spir64); EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch()); EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch()); + + T.setArch(Triple::wasm32); + EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch()); + + T.setArch(Triple::wasm64); + EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch()); } TEST(TripleTest, getOSVersion) { diff --git a/unittests/AsmParser/AsmParserTest.cpp b/unittests/AsmParser/AsmParserTest.cpp index 8847b1871673..9c2081fa2f2d 100644 --- a/unittests/AsmParser/AsmParserTest.cpp +++ b/unittests/AsmParser/AsmParserTest.cpp @@ -9,6 +9,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/AsmParser/Parser.h" +#include "llvm/AsmParser/SlotMapping.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Support/SourceMgr.h" @@ -44,4 +45,23 @@ TEST(AsmParserTest, NonNullTerminatedInput) { #endif #endif +TEST(AsmParserTest, SlotMappingTest) { + LLVMContext &Ctx = getGlobalContext(); + StringRef Source = "@0 = global i32 0\n !0 = !{}\n !42 = !{i32 42}"; + SMDiagnostic Error; + SlotMapping Mapping; + auto Mod = parseAssemblyString(Source, Error, Ctx, &Mapping); + + EXPECT_TRUE(Mod != nullptr); + EXPECT_TRUE(Error.getMessage().empty()); + + ASSERT_EQ(Mapping.GlobalValues.size(), 1u); + EXPECT_TRUE(isa<GlobalVariable>(Mapping.GlobalValues[0])); + + EXPECT_EQ(Mapping.MetadataNodes.size(), 2u); + EXPECT_EQ(Mapping.MetadataNodes.count(0), 1u); + EXPECT_EQ(Mapping.MetadataNodes.count(42), 1u); + EXPECT_EQ(Mapping.MetadataNodes.count(1), 0u); +} + } // end anonymous namespace diff --git a/unittests/CodeGen/DIEHashTest.cpp b/unittests/CodeGen/DIEHashTest.cpp index 8e78f0ca13b5..e3a9e5628276 100644 --- a/unittests/CodeGen/DIEHashTest.cpp +++ b/unittests/CodeGen/DIEHashTest.cpp @@ -22,6 +22,10 @@ namespace { // Test fixture class DIEHashTest : public testing::Test { +public: + BumpPtrAllocator Alloc; + +private: StringMap<DwarfStringPoolEntry> Pool; public: @@ -34,22 +38,22 @@ public: TEST_F(DIEHashTest, Data1) { DIEHash Hash; - DIE Die(dwarf::DW_TAG_base_type); + DIE &Die = *DIE::get(Alloc, dwarf::DW_TAG_base_type); DIEInteger Size(4); - Die.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size); + Die.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size); uint64_t MD5Res = Hash.computeTypeSignature(Die); ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res); } // struct {}; TEST_F(DIEHashTest, TrivialType) { - DIE Unnamed(dwarf::DW_TAG_structure_type); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); // Line and file number are ignored. - Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); + Unnamed.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + Unnamed.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); // The exact same hash GCC produces for this DIE. @@ -58,11 +62,11 @@ TEST_F(DIEHashTest, TrivialType) { // struct foo { }; TEST_F(DIEHashTest, NamedType) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); @@ -72,20 +76,21 @@ TEST_F(DIEHashTest, NamedType) { // namespace space { struct foo { }; } TEST_F(DIEHashTest, NamespacedType) { - DIE CU(dwarf::DW_TAG_compile_unit); + DIE &CU = *DIE::get(Alloc, dwarf::DW_TAG_compile_unit); - auto Space = make_unique<DIE>(dwarf::DW_TAG_namespace); + auto Space = DIE::get(Alloc, dwarf::DW_TAG_namespace); DIEInteger One(1); DIEString SpaceStr = getString("space"); - Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, SpaceStr); + Space->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, SpaceStr); // DW_AT_declaration is ignored. - Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); + Space->addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); // sibling? - auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); + auto Foo = DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEString FooStr = getString("foo"); - Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Foo->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo->addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); DIE &N = *Foo; Space->addChild(std::move(Foo)); @@ -99,26 +104,26 @@ TEST_F(DIEHashTest, NamespacedType) { // struct { int member; }; TEST_F(DIEHashTest, TypeWithMember) { - DIE Unnamed(dwarf::DW_TAG_structure_type); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Four(4); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); - DIE Int(dwarf::DW_TAG_base_type); + DIE &Int = *DIE::get(Alloc, dwarf::DW_TAG_base_type); DIEString IntStr = getString("int"); - Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); - Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); + Int.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); + Int.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); DIEInteger Five(5); - Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); + Int.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); DIEEntry IntRef(Int); - auto Member = make_unique<DIE>(dwarf::DW_TAG_member); + auto Member = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemberStr = getString("member"); - Member->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemberStr); + Member->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemberStr); DIEInteger Zero(0); - Member->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, - Zero); - Member->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); + Member->addValue(Alloc, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_data1, Zero); + Member->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); Unnamed.addChild(std::move(Member)); @@ -129,36 +134,36 @@ TEST_F(DIEHashTest, TypeWithMember) { // struct foo { int mem1, mem2; }; TEST_F(DIEHashTest, ReusedType) { - DIE Unnamed(dwarf::DW_TAG_structure_type); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Eight(8); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEInteger Four(4); - DIE Int(dwarf::DW_TAG_base_type); + DIE &Int = *DIE::get(Alloc, dwarf::DW_TAG_base_type); DIEString IntStr = getString("int"); - Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); - Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); + Int.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); + Int.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); DIEInteger Five(5); - Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); + Int.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); DIEEntry IntRef(Int); - auto Mem1 = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem1 = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString Mem1Str = getString("mem1"); - Mem1->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str); + Mem1->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str); DIEInteger Zero(0); - Mem1->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Mem1->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); - Mem1->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); + Mem1->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); Unnamed.addChild(std::move(Mem1)); - auto Mem2 = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem2 = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString Mem2Str = getString("mem2"); - Mem2->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem2Str); - Mem2->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Mem2->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem2Str); + Mem2->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Four); - Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); + Mem2->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); Unnamed.addChild(std::move(Mem2)); @@ -169,17 +174,17 @@ TEST_F(DIEHashTest, ReusedType) { // struct foo { static foo f; }; TEST_F(DIEHashTest, RecursiveType) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemStr = getString("mem"); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); DIEEntry FooRef(Foo); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); // DW_AT_external and DW_AT_declaration are ignored anyway, so skip them. Foo.addChild(std::move(Mem)); @@ -191,25 +196,26 @@ TEST_F(DIEHashTest, RecursiveType) { // struct foo { foo *mem; }; TEST_F(DIEHashTest, Pointer) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Eight(8); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemStr = getString("mem"); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); DIEInteger Zero(0); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Zero); - DIE FooPtr(dwarf::DW_TAG_pointer_type); - FooPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + DIE &FooPtr = *DIE::get(Alloc, dwarf::DW_TAG_pointer_type); + FooPtr.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEEntry FooRef(Foo); - FooPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); + FooPtr.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); DIEEntry FooPtrRef(FooPtr); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooPtrRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooPtrRef); Foo.addChild(std::move(Mem)); @@ -220,29 +226,31 @@ TEST_F(DIEHashTest, Pointer) { // struct foo { foo &mem; }; TEST_F(DIEHashTest, Reference) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Eight(8); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemStr = getString("mem"); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); DIEInteger Zero(0); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Zero); - DIE FooRef(dwarf::DW_TAG_reference_type); - FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + DIE &FooRef = *DIE::get(Alloc, dwarf::DW_TAG_reference_type); + FooRef.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEEntry FooEntry(Foo); - FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); + FooRef.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); - DIE FooRefConst(dwarf::DW_TAG_const_type); + DIE &FooRefConst = *DIE::get(Alloc, dwarf::DW_TAG_const_type); DIEEntry FooRefRef(FooRef); - FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefRef); + FooRefConst.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + FooRefRef); DIEEntry FooRefConstRef(FooRefConst); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); Foo.addChild(std::move(Mem)); @@ -253,29 +261,31 @@ TEST_F(DIEHashTest, Reference) { // struct foo { foo &&mem; }; TEST_F(DIEHashTest, RValueReference) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Eight(8); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemStr = getString("mem"); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); DIEInteger Zero(0); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Zero); - DIE FooRef(dwarf::DW_TAG_rvalue_reference_type); - FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + DIE &FooRef = *DIE::get(Alloc, dwarf::DW_TAG_rvalue_reference_type); + FooRef.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEEntry FooEntry(Foo); - FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); + FooRef.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); - DIE FooRefConst(dwarf::DW_TAG_const_type); + DIE &FooRefConst = *DIE::get(Alloc, dwarf::DW_TAG_const_type); DIEEntry FooRefRef(FooRef); - FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefRef); + FooRefConst.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + FooRefRef); DIEEntry FooRefConstRef(FooRefConst); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); Foo.addChild(std::move(Mem)); @@ -286,26 +296,27 @@ TEST_F(DIEHashTest, RValueReference) { // struct foo { foo foo::*mem; }; TEST_F(DIEHashTest, PtrToMember) { - DIE Foo(dwarf::DW_TAG_structure_type); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger Eight(8); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); DIEString FooStr = getString("foo"); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString MemStr = getString("mem"); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); DIEInteger Zero(0); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Zero); - DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); + DIE &PtrToFooMem = *DIE::get(Alloc, dwarf::DW_TAG_ptr_to_member_type); DIEEntry FooEntry(Foo); - PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); - PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, FooEntry); DIEEntry PtrToFooMemRef(PtrToFooMem); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); Foo.addChild(std::move(Mem)); @@ -328,28 +339,31 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMatch) { DIEString MemStr = getString("mem"); uint64_t MD5ResDecl; { - DIE Bar(dwarf::DW_TAG_structure_type); - Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); - Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); + DIE &Bar = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); + Bar.addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); - DIE Foo(dwarf::DW_TAG_structure_type); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, - Zero); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_data1, Zero); - DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); + DIE &PtrToFooMem = *DIE::get(Alloc, dwarf::DW_TAG_ptr_to_member_type); DIEEntry BarEntry(Bar); - PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + BarEntry); DIEEntry FooEntry(Foo); - PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, - FooEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type, + dwarf::DW_FORM_ref4, FooEntry); DIEEntry PtrToFooMemRef(PtrToFooMem); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + PtrToFooMemRef); Foo.addChild(std::move(Mem)); @@ -357,28 +371,30 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMatch) { } uint64_t MD5ResDef; { - DIE Bar(dwarf::DW_TAG_structure_type); - Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); - Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + DIE &Bar = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); + Bar.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - DIE Foo(dwarf::DW_TAG_structure_type); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, - Zero); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_data1, Zero); - DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); + DIE &PtrToFooMem = *DIE::get(Alloc, dwarf::DW_TAG_ptr_to_member_type); DIEEntry BarEntry(Bar); - PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + BarEntry); DIEEntry FooEntry(Foo); - PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, - FooEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type, + dwarf::DW_FORM_ref4, FooEntry); DIEEntry PtrToFooMemRef(PtrToFooMem); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + PtrToFooMemRef); Foo.addChild(std::move(Mem)); @@ -401,27 +417,30 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMisMatch) { DIEString MemStr = getString("mem"); uint64_t MD5ResDecl; { - DIE Bar(dwarf::DW_TAG_structure_type); - Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); - Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); + DIE &Bar = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); + Bar.addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); - DIE Foo(dwarf::DW_TAG_structure_type); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, - Zero); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_data1, Zero); - DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); + DIE &PtrToFooMem = *DIE::get(Alloc, dwarf::DW_TAG_ptr_to_member_type); DIEEntry BarEntry(Bar); - PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); - PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type, + dwarf::DW_FORM_ref4, BarEntry); DIEEntry PtrToFooMemRef(PtrToFooMem); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + PtrToFooMemRef); Foo.addChild(std::move(Mem)); @@ -429,27 +448,29 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMisMatch) { } uint64_t MD5ResDef; { - DIE Bar(dwarf::DW_TAG_structure_type); - Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); - Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + DIE &Bar = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); + Bar.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - DIE Foo(dwarf::DW_TAG_structure_type); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, - Zero); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, + dwarf::DW_FORM_data1, Zero); - DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); + DIE &PtrToFooMem = *DIE::get(Alloc, dwarf::DW_TAG_ptr_to_member_type); DIEEntry BarEntry(Bar); - PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); - PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); + PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type, + dwarf::DW_FORM_ref4, BarEntry); DIEEntry PtrToFooMemRef(PtrToFooMem); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + PtrToFooMemRef); Foo.addChild(std::move(Mem)); @@ -472,24 +493,27 @@ TEST_F(DIEHashTest, RefUnnamedType) { DIEString FooStr = getString("foo"); DIEString MemStr = getString("mem"); - DIE Unnamed(dwarf::DW_TAG_structure_type); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - DIE Foo(dwarf::DW_TAG_structure_type); - Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); - Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + DIE &Foo = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); + Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); - Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); - Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); + auto Mem = DIE::get(Alloc, dwarf::DW_TAG_member); + Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); + Mem->addValue(Alloc, dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, + Zero); - DIE UnnamedPtr(dwarf::DW_TAG_pointer_type); - UnnamedPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); + DIE &UnnamedPtr = *DIE::get(Alloc, dwarf::DW_TAG_pointer_type); + UnnamedPtr.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, + Eight); DIEEntry UnnamedRef(Unnamed); - UnnamedPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedRef); + UnnamedPtr.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, + UnnamedRef); DIEEntry UnnamedPtrRef(UnnamedPtr); - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedPtrRef); + Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedPtrRef); Foo.addChild(std::move(Mem)); @@ -500,14 +524,14 @@ TEST_F(DIEHashTest, RefUnnamedType) { // struct { struct foo { }; }; TEST_F(DIEHashTest, NestedType) { - DIE Unnamed(dwarf::DW_TAG_structure_type); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); + auto Foo = DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEString FooStr = getString("foo"); - Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); - Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Foo->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); + Foo->addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); Unnamed.addChild(std::move(Foo)); @@ -519,13 +543,13 @@ TEST_F(DIEHashTest, NestedType) { // struct { static void func(); }; TEST_F(DIEHashTest, MemberFunc) { - DIE Unnamed(dwarf::DW_TAG_structure_type); + DIE &Unnamed = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); - Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); + auto Func = DIE::get(Alloc, dwarf::DW_TAG_subprogram); DIEString FuncStr = getString("func"); - Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); + Func->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); Unnamed.addChild(std::move(Func)); @@ -539,24 +563,27 @@ TEST_F(DIEHashTest, MemberFunc) { // static void func(); // }; TEST_F(DIEHashTest, MemberFuncFlag) { - DIE A(dwarf::DW_TAG_structure_type); + DIE &A = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); DIEString AStr = getString("A"); - A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); - A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); + A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); - auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); + auto Func = DIE::get(Alloc, dwarf::DW_TAG_subprogram); DIEString FuncStr = getString("func"); DIEString FuncLinkage = getString("_ZN1A4funcEv"); DIEInteger Two(2); - Func->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); - Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); - Func->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - Func->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); - Func->addValue(dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp, FuncLinkage); - Func->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); + Func->addValue(Alloc, dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, + One); + Func->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); + Func->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + Func->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); + Func->addValue(Alloc, dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp, + FuncLinkage); + Func->addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); A.addChild(std::move(Func)); @@ -572,38 +599,39 @@ TEST_F(DIEHashTest, MemberFuncFlag) { // }; // A a; TEST_F(DIEHashTest, MemberSdata) { - DIE A(dwarf::DW_TAG_structure_type); + DIE &A = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); DIEString AStr = getString("A"); - A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); - A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); + A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); DIEInteger Four(4); DIEInteger Five(5); DIEString FStr = getString("int"); - DIE IntTyDIE(dwarf::DW_TAG_base_type); - IntTyDIE.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); - IntTyDIE.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); - IntTyDIE.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); + DIE &IntTyDIE = *DIE::get(Alloc, dwarf::DW_TAG_base_type); + IntTyDIE.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); + IntTyDIE.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); + IntTyDIE.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); DIEEntry IntTy(IntTyDIE); - auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); - PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntTy); + auto PITyDIE = DIE::get(Alloc, dwarf::DW_TAG_const_type); + PITyDIE->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntTy); DIEEntry PITy(*PITyDIE); - auto PI = make_unique<DIE>(dwarf::DW_TAG_member); + auto PI = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString PIStr = getString("PI"); DIEInteger Two(2); DIEInteger NegThree(-3); - PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); - PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); - PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); - PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); - PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); - PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, NegThree); + PI->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); + PI->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + PI->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); + PI->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); + PI->addValue(Alloc, dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); + PI->addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); + PI->addValue(Alloc, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, NegThree); A.addChild(std::move(PI)); @@ -617,35 +645,37 @@ TEST_F(DIEHashTest, MemberSdata) { // }; // A a; TEST_F(DIEHashTest, MemberBlock) { - DIE A(dwarf::DW_TAG_structure_type); + DIE &A = *DIE::get(Alloc, dwarf::DW_TAG_structure_type); DIEInteger One(1); DIEString AStr = getString("A"); - A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); - A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); + A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); DIEInteger Four(4); DIEString FStr = getString("float"); - auto FloatTyDIE = make_unique<DIE>(dwarf::DW_TAG_base_type); - FloatTyDIE->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); - FloatTyDIE->addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Four); - FloatTyDIE->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); - + auto FloatTyDIE = DIE::get(Alloc, dwarf::DW_TAG_base_type); + FloatTyDIE->addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, + Four); + FloatTyDIE->addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, + Four); + FloatTyDIE->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); DIEEntry FloatTy(*FloatTyDIE); - auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); - PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FloatTy); + auto PITyDIE = DIE::get(Alloc, dwarf::DW_TAG_const_type); + PITyDIE->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FloatTy); DIEEntry PITy(*PITyDIE); - auto PI = make_unique<DIE>(dwarf::DW_TAG_member); + auto PI = DIE::get(Alloc, dwarf::DW_TAG_member); DIEString PIStr = getString("PI"); DIEInteger Two(2); - PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); - PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); - PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); - PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); - PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); - PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); + PI->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); + PI->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); + PI->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); + PI->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); + PI->addValue(Alloc, dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); + PI->addValue(Alloc, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, + One); DIEBlock PIBlock; DIEInteger Blk1(0xc3); @@ -653,12 +683,13 @@ TEST_F(DIEHashTest, MemberBlock) { DIEInteger Blk3(0x48); DIEInteger Blk4(0x40); - PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk1); - PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk2); - PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk3); - PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk4); + PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk1); + PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk2); + PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk3); + PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk4); - PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_block1, &PIBlock); + PI->addValue(Alloc, dwarf::DW_AT_const_value, dwarf::DW_FORM_block1, + &PIBlock); A.addChild(std::move(PI)); diff --git a/unittests/ExecutionEngine/Orc/CMakeLists.txt b/unittests/ExecutionEngine/Orc/CMakeLists.txt index 67b215ebc6d4..30bd19fa3d23 100644 --- a/unittests/ExecutionEngine/Orc/CMakeLists.txt +++ b/unittests/ExecutionEngine/Orc/CMakeLists.txt @@ -7,5 +7,6 @@ set(LLVM_LINK_COMPONENTS add_llvm_unittest(OrcJITTests IndirectionUtilsTest.cpp LazyEmittingLayerTest.cpp + ObjectTransformLayerTest.cpp OrcTestCommon.cpp ) diff --git a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp new file mode 100644 index 000000000000..41b2307cadd8 --- /dev/null +++ b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp @@ -0,0 +1,302 @@ +//===- ObjectTransformLayerTest.cpp - Unit tests for ObjectTransformLayer -===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallVector.h" +#include "gtest/gtest.h" + +using namespace llvm::orc; + +namespace { + +// Stand-in for RuntimeDyld::MemoryManager +typedef int MockMemoryManager; + +// Stand-in for RuntimeDyld::SymbolResolver +typedef int MockSymbolResolver; + +// stand-in for object::ObjectFile +typedef int MockObjectFile; + +// stand-in for llvm::MemoryBuffer set +typedef int MockMemoryBufferSet; + +// Mock transform that operates on unique pointers to object files, and +// allocates new object files rather than mutating the given ones. +struct AllocatingTransform { + std::unique_ptr<MockObjectFile> + operator()(std::unique_ptr<MockObjectFile> Obj) const { + return llvm::make_unique<MockObjectFile>(*Obj + 1); + } +}; + +// Mock base layer for verifying behavior of transform layer. +// Each method "T foo(args)" is accompanied by two auxiliary methods: +// - "void expectFoo(args)", to be called before calling foo on the transform +// layer; saves values of args, which mock layer foo then verifies against. +// - "void verifyFoo(T)", to be called after foo, which verifies that the +// transform layer called the base layer and forwarded any return value. +class MockBaseLayer { +public: + typedef int ObjSetHandleT; + + MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); } + + template <typename ObjSetT, typename MemoryManagerPtrT, + typename SymbolResolverPtrT> + ObjSetHandleT addObjectSet(ObjSetT &Objects, MemoryManagerPtrT MemMgr, + SymbolResolverPtrT Resolver) { + EXPECT_EQ(MockManager, *MemMgr) << "MM should pass through"; + EXPECT_EQ(MockResolver, *Resolver) << "Resolver should pass through"; + size_t I = 0; + for (auto &ObjPtr : Objects) { + EXPECT_EQ(MockObjects[I++] + 1, *ObjPtr) << "Transform should be applied"; + } + EXPECT_EQ(MockObjects.size(), I) << "Number of objects should match"; + LastCalled = "addObjectSet"; + MockObjSetHandle = 111; + return MockObjSetHandle; + } + template <typename ObjSetT> + void expectAddObjectSet(ObjSetT &Objects, MockMemoryManager *MemMgr, + MockSymbolResolver *Resolver) { + MockManager = *MemMgr; + MockResolver = *Resolver; + for (auto &ObjPtr : Objects) { + MockObjects.push_back(*ObjPtr); + } + } + void verifyAddObjectSet(ObjSetHandleT Returned) { + EXPECT_EQ("addObjectSet", LastCalled); + EXPECT_EQ(MockObjSetHandle, Returned) << "Return should pass through"; + resetExpectations(); + } + + void removeObjectSet(ObjSetHandleT H) { + EXPECT_EQ(MockObjSetHandle, H); + LastCalled = "removeObjectSet"; + } + void expectRemoveObjectSet(ObjSetHandleT H) { MockObjSetHandle = H; } + void verifyRemoveObjectSet() { + EXPECT_EQ("removeObjectSet", LastCalled); + resetExpectations(); + } + + JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) { + EXPECT_EQ(MockName, Name) << "Name should pass through"; + EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through"; + LastCalled = "findSymbol"; + MockSymbol = JITSymbol(122, llvm::JITSymbolFlags::None); + return MockSymbol; + } + void expectFindSymbol(const std::string &Name, bool ExportedSymbolsOnly) { + MockName = Name; + MockBool = ExportedSymbolsOnly; + } + void verifyFindSymbol(llvm::orc::JITSymbol Returned) { + EXPECT_EQ("findSymbol", LastCalled); + EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress()) + << "Return should pass through"; + resetExpectations(); + } + + JITSymbol findSymbolIn(ObjSetHandleT H, const std::string &Name, + bool ExportedSymbolsOnly) { + EXPECT_EQ(MockObjSetHandle, H) << "Handle should pass through"; + EXPECT_EQ(MockName, Name) << "Name should pass through"; + EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through"; + LastCalled = "findSymbolIn"; + MockSymbol = JITSymbol(122, llvm::JITSymbolFlags::None); + return MockSymbol; + } + void expectFindSymbolIn(ObjSetHandleT H, const std::string &Name, + bool ExportedSymbolsOnly) { + MockObjSetHandle = H; + MockName = Name; + MockBool = ExportedSymbolsOnly; + } + void verifyFindSymbolIn(llvm::orc::JITSymbol Returned) { + EXPECT_EQ("findSymbolIn", LastCalled); + EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress()) + << "Return should pass through"; + resetExpectations(); + } + + void emitAndFinalize(ObjSetHandleT H) { + EXPECT_EQ(MockObjSetHandle, H) << "Handle should pass through"; + LastCalled = "emitAndFinalize"; + } + void expectEmitAndFinalize(ObjSetHandleT H) { MockObjSetHandle = H; } + void verifyEmitAndFinalize() { + EXPECT_EQ("emitAndFinalize", LastCalled); + resetExpectations(); + } + + void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress, + TargetAddress TargetAddr) { + EXPECT_EQ(MockObjSetHandle, H); + EXPECT_EQ(MockLocalAddress, LocalAddress); + EXPECT_EQ(MockTargetAddress, TargetAddr); + LastCalled = "mapSectionAddress"; + } + void expectMapSectionAddress(ObjSetHandleT H, const void *LocalAddress, + TargetAddress TargetAddr) { + MockObjSetHandle = H; + MockLocalAddress = LocalAddress; + MockTargetAddress = TargetAddr; + } + void verifyMapSectionAddress() { + EXPECT_EQ("mapSectionAddress", LastCalled); + resetExpectations(); + } + + template <typename OwningMBSet> + void takeOwnershipOfBuffers(ObjSetHandleT H, OwningMBSet MBs) { + EXPECT_EQ(MockObjSetHandle, H); + EXPECT_EQ(MockBufferSet, *MBs); + LastCalled = "takeOwnershipOfBuffers"; + } + void expectTakeOwnershipOfBuffers(ObjSetHandleT H, MockMemoryBufferSet *MBs) { + MockObjSetHandle = H; + MockBufferSet = *MBs; + } + void verifyTakeOwnershipOfBuffers() { + EXPECT_EQ("takeOwnershipOfBuffers", LastCalled); + resetExpectations(); + } + +private: + // Backing fields for remembering parameter/return values + std::string LastCalled; + MockMemoryManager MockManager; + MockSymbolResolver MockResolver; + std::vector<MockObjectFile> MockObjects; + ObjSetHandleT MockObjSetHandle; + std::string MockName; + bool MockBool; + JITSymbol MockSymbol; + const void *MockLocalAddress; + TargetAddress MockTargetAddress; + MockMemoryBufferSet MockBufferSet; + + // Clear remembered parameters between calls + void resetExpectations() { + LastCalled = "nothing"; + MockManager = 0; + MockResolver = 0; + MockObjects.clear(); + MockObjSetHandle = 0; + MockName = "bogus"; + MockSymbol = JITSymbol(nullptr); + MockLocalAddress = nullptr; + MockTargetAddress = 0; + MockBufferSet = 0; + } +}; + +// Test each operation on ObjectTransformLayer. +TEST(ObjectTransformLayerTest, Main) { + MockBaseLayer M; + + // Create one object transform layer using a transform (as a functor) + // that allocates new objects, and deals in unique pointers. + ObjectTransformLayer<MockBaseLayer, AllocatingTransform> T1(M); + + // Create a second object transform layer using a transform (as a lambda) + // that mutates objects in place, and deals in naked pointers + ObjectTransformLayer<MockBaseLayer, + std::function<MockObjectFile *(MockObjectFile *)>> + T2(M, [](MockObjectFile *Obj) { + ++(*Obj); + return Obj; + }); + + // Instantiate some mock objects to use below + MockObjectFile MockObject1 = 211; + MockObjectFile MockObject2 = 222; + MockMemoryManager MockManager = 233; + MockSymbolResolver MockResolver = 244; + + // Test addObjectSet with T1 (allocating, unique pointers) + std::vector<std::unique_ptr<MockObjectFile>> Objs1; + Objs1.push_back(llvm::make_unique<MockObjectFile>(MockObject1)); + Objs1.push_back(llvm::make_unique<MockObjectFile>(MockObject2)); + auto MM = llvm::make_unique<MockMemoryManager>(MockManager); + auto SR = llvm::make_unique<MockSymbolResolver>(MockResolver); + M.expectAddObjectSet(Objs1, MM.get(), SR.get()); + auto H = T1.addObjectSet(Objs1, std::move(MM), std::move(SR)); + M.verifyAddObjectSet(H); + + // Test addObjectSet with T2 (mutating, naked pointers) + llvm::SmallVector<MockObjectFile *, 2> Objs2; + Objs2.push_back(&MockObject1); + Objs2.push_back(&MockObject2); + M.expectAddObjectSet(Objs2, &MockManager, &MockResolver); + H = T2.addObjectSet(Objs2, &MockManager, &MockResolver); + M.verifyAddObjectSet(H); + EXPECT_EQ(212, MockObject1) << "Expected mutation"; + EXPECT_EQ(223, MockObject2) << "Expected mutation"; + + // Test removeObjectSet + M.expectRemoveObjectSet(H); + T1.removeObjectSet(H); + M.verifyRemoveObjectSet(); + + // Test findSymbol + std::string Name = "foo"; + bool ExportedOnly = true; + M.expectFindSymbol(Name, ExportedOnly); + JITSymbol Symbol = T2.findSymbol(Name, ExportedOnly); + M.verifyFindSymbol(Symbol); + + // Test findSymbolIn + Name = "bar"; + ExportedOnly = false; + M.expectFindSymbolIn(H, Name, ExportedOnly); + Symbol = T1.findSymbolIn(H, Name, ExportedOnly); + M.verifyFindSymbolIn(Symbol); + + // Test emitAndFinalize + M.expectEmitAndFinalize(H); + T2.emitAndFinalize(H); + M.verifyEmitAndFinalize(); + + // Test mapSectionAddress + char Buffer[24]; + TargetAddress MockAddress = 255; + M.expectMapSectionAddress(H, Buffer, MockAddress); + T1.mapSectionAddress(H, Buffer, MockAddress); + M.verifyMapSectionAddress(); + + // Test takeOwnershipOfBuffers, using unique pointer to buffer set + auto MockBufferSetPtr = llvm::make_unique<MockMemoryBufferSet>(366); + M.expectTakeOwnershipOfBuffers(H, MockBufferSetPtr.get()); + T2.takeOwnershipOfBuffers(H, std::move(MockBufferSetPtr)); + M.verifyTakeOwnershipOfBuffers(); + + // Test takeOwnershipOfBuffers, using naked pointer to buffer set + MockMemoryBufferSet MockBufferSet = 266; + M.expectTakeOwnershipOfBuffers(H, &MockBufferSet); + T1.takeOwnershipOfBuffers(H, &MockBufferSet); + M.verifyTakeOwnershipOfBuffers(); + + // Verify transform getter (non-const) + MockObjectFile Mutatee = 277; + MockObjectFile *Out = T2.getTransform()(&Mutatee); + EXPECT_EQ(&Mutatee, Out) << "Expected in-place transform"; + EXPECT_EQ(278, Mutatee) << "Expected incrementing transform"; + + // Verify transform getter (const) + auto OwnedObj = llvm::make_unique<MockObjectFile>(288); + const auto &T1C = T1; + OwnedObj = T1C.getTransform()(std::move(OwnedObj)); + EXPECT_EQ(289, *OwnedObj) << "Expected incrementing transform"; +} +} diff --git a/unittests/IR/IRBuilderTest.cpp b/unittests/IR/IRBuilderTest.cpp index f18934922a0a..f3db68feacce 100644 --- a/unittests/IR/IRBuilderTest.cpp +++ b/unittests/IR/IRBuilderTest.cpp @@ -333,4 +333,39 @@ TEST_F(IRBuilderTest, CreateGlobalStringPtr) { EXPECT_TRUE(String2->getType()->getPointerAddressSpace() == 1); EXPECT_TRUE(String3->getType()->getPointerAddressSpace() == 2); } + +TEST_F(IRBuilderTest, DebugLoc) { + auto CalleeTy = FunctionType::get(Type::getVoidTy(Ctx), + /*isVarArg=*/false); + auto Callee = + Function::Create(CalleeTy, Function::ExternalLinkage, "", M.get()); + + DIBuilder DIB(*M); + auto File = DIB.createFile("tmp.cpp", "/"); + auto CU = DIB.createCompileUnit(dwarf::DW_LANG_C_plus_plus_11, "tmp.cpp", "/", + "", true, "", 0); + auto SPType = DIB.createSubroutineType(File, DIB.getOrCreateTypeArray(None)); + auto SP = + DIB.createFunction(CU, "foo", "foo", File, 1, SPType, false, true, 1); + DebugLoc DL1 = DILocation::get(Ctx, 2, 0, SP); + DebugLoc DL2 = DILocation::get(Ctx, 3, 0, SP); + + auto BB2 = BasicBlock::Create(Ctx, "bb2", F); + auto Br = BranchInst::Create(BB2, BB); + Br->setDebugLoc(DL1); + + IRBuilder<> Builder(Ctx); + Builder.SetInsertPoint(Br); + EXPECT_EQ(DL1, Builder.getCurrentDebugLocation()); + auto Call1 = Builder.CreateCall(Callee, None); + EXPECT_EQ(DL1, Call1->getDebugLoc()); + + Call1->setDebugLoc(DL2); + Builder.SetInsertPoint(Call1->getParent(), Call1); + EXPECT_EQ(DL2, Builder.getCurrentDebugLocation()); + auto Call2 = Builder.CreateCall(Callee, None); + EXPECT_EQ(DL2, Call2->getDebugLoc()); + + DIB.finalize(); +} } diff --git a/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index b255ba8e0348..b58615ce653b 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/unittests/IR/MetadataTest.cpp @@ -16,6 +16,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" +#include "llvm/IR/ModuleSlotTracker.h" #include "llvm/IR/Type.h" #include "llvm/IR/Verifier.h" #include "llvm/Support/raw_ostream.h" @@ -356,6 +357,10 @@ TEST_F(MDNodeTest, PrintFromFunction) { EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, &M)); EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, &M)); + + ModuleSlotTracker MST(&M); + EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, MST)); + EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, MST)); } TEST_F(MDNodeTest, PrintFromMetadataAsValue) { @@ -384,6 +389,14 @@ TEST_F(MDNodeTest, PrintFromMetadataAsValue) { EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false)); EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true)); EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true)); + + ModuleSlotTracker MST(&M); + EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0->print(OS, MST)); + EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1->print(OS, MST)); + EXPECT_PRINTER_EQ("!0", MAV0->printAsOperand(OS, false, MST)); + EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false, MST)); + EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true, MST)); + EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true, MST)); } #undef EXPECT_PRINTER_EQ @@ -1691,6 +1704,40 @@ TEST_F(DINamespaceTest, get) { EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); } +typedef MetadataTest DIModuleTest; + +TEST_F(DIModuleTest, get) { + DIScope *Scope = getFile(); + StringRef Name = "module"; + StringRef ConfigMacro = "-DNDEBUG"; + StringRef Includes = "-I."; + StringRef Sysroot = "/"; + + auto *N = DIModule::get(Context, Scope, Name, ConfigMacro, Includes, Sysroot); + + EXPECT_EQ(dwarf::DW_TAG_module, N->getTag()); + EXPECT_EQ(Scope, N->getScope()); + EXPECT_EQ(Name, N->getName()); + EXPECT_EQ(ConfigMacro, N->getConfigurationMacros()); + EXPECT_EQ(Includes, N->getIncludePath()); + EXPECT_EQ(Sysroot, N->getISysRoot()); + EXPECT_EQ(N, DIModule::get(Context, Scope, Name, + ConfigMacro, Includes, Sysroot)); + EXPECT_NE(N, DIModule::get(Context, getFile(), Name, + ConfigMacro, Includes, Sysroot)); + EXPECT_NE(N, DIModule::get(Context, Scope, "other", + ConfigMacro, Includes, Sysroot)); + EXPECT_NE(N, DIModule::get(Context, Scope, Name, + "other", Includes, Sysroot)); + EXPECT_NE(N, DIModule::get(Context, Scope, Name, + ConfigMacro, "other", Sysroot)); + EXPECT_NE(N, DIModule::get(Context, Scope, Name, + ConfigMacro, Includes, "other")); + + TempDIModule Temp = N->clone(); + EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); +} + typedef MetadataTest DITemplateTypeParameterTest; TEST_F(DITemplateTypeParameterTest, get) { diff --git a/unittests/IR/ValueTest.cpp b/unittests/IR/ValueTest.cpp index 4dd0c2c36cf0..32d66a1b4721 100644 --- a/unittests/IR/ValueTest.cpp +++ b/unittests/IR/ValueTest.cpp @@ -11,6 +11,7 @@ #include "llvm/IR/Function.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" +#include "llvm/IR/ModuleSlotTracker.h" #include "llvm/IR/Value.h" #include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" @@ -106,4 +107,72 @@ TEST(GlobalTest, AlignDeath) { #endif #endif +TEST(ValueTest, printSlots) { + // Check that Value::print() and Value::printAsOperand() work with and + // without a slot tracker. + LLVMContext C; + + const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n" + "entry:\n" + " %0 = add i32 %y, 1\n" + " %1 = add i32 %y, 1\n" + " ret void\n" + "}\n"; + SMDiagnostic Err; + std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C); + + Function *F = M->getFunction("f"); + ASSERT_TRUE(F); + ASSERT_FALSE(F->empty()); + BasicBlock &BB = F->getEntryBlock(); + ASSERT_EQ(3u, BB.size()); + + Instruction *I0 = BB.begin(); + ASSERT_TRUE(I0); + Instruction *I1 = ++BB.begin(); + ASSERT_TRUE(I1); + + ModuleSlotTracker MST(M.get()); + +#define CHECK_PRINT(INST, STR) \ + do { \ + { \ + std::string S; \ + raw_string_ostream OS(S); \ + INST->print(OS); \ + EXPECT_EQ(STR, OS.str()); \ + } \ + { \ + std::string S; \ + raw_string_ostream OS(S); \ + INST->print(OS, MST); \ + EXPECT_EQ(STR, OS.str()); \ + } \ + } while (false) + CHECK_PRINT(I0, " %0 = add i32 %y, 1"); + CHECK_PRINT(I1, " %1 = add i32 %y, 1"); +#undef CHECK_PRINT + +#define CHECK_PRINT_AS_OPERAND(INST, TYPE, STR) \ + do { \ + { \ + std::string S; \ + raw_string_ostream OS(S); \ + INST->printAsOperand(OS, TYPE); \ + EXPECT_EQ(StringRef(STR), StringRef(OS.str())); \ + } \ + { \ + std::string S; \ + raw_string_ostream OS(S); \ + INST->printAsOperand(OS, TYPE, MST); \ + EXPECT_EQ(StringRef(STR), StringRef(OS.str())); \ + } \ + } while (false) + CHECK_PRINT_AS_OPERAND(I0, false, "%0"); + CHECK_PRINT_AS_OPERAND(I1, false, "%1"); + CHECK_PRINT_AS_OPERAND(I0, true, "i32 %0"); + CHECK_PRINT_AS_OPERAND(I1, true, "i32 %1"); +#undef CHECK_PRINT_AS_OPERAND +} + } // end anonymous namespace diff --git a/unittests/Option/OptionParsingTest.cpp b/unittests/Option/OptionParsingTest.cpp index 521009a9e663..55cf8a95f35e 100644 --- a/unittests/Option/OptionParsingTest.cpp +++ b/unittests/Option/OptionParsingTest.cpp @@ -67,27 +67,26 @@ const char *Args[] = { TEST(Option, OptionParsing) { TestOptTable T; unsigned MAI, MAC; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(Args), std::end(Args), MAI, MAC)); + InputArgList AL = T.ParseArgs(Args, MAI, MAC); // Check they all exist. - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_TRUE(AL->hasArg(OPT_D)); - EXPECT_TRUE(AL->hasArg(OPT_E)); - EXPECT_TRUE(AL->hasArg(OPT_F)); - EXPECT_TRUE(AL->hasArg(OPT_G)); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_TRUE(AL.hasArg(OPT_D)); + EXPECT_TRUE(AL.hasArg(OPT_E)); + EXPECT_TRUE(AL.hasArg(OPT_F)); + EXPECT_TRUE(AL.hasArg(OPT_G)); // Check the values. - EXPECT_EQ(AL->getLastArgValue(OPT_B), "hi"); - EXPECT_EQ(AL->getLastArgValue(OPT_C), "bye"); - EXPECT_EQ(AL->getLastArgValue(OPT_D), "adena"); - std::vector<std::string> Es = AL->getAllArgValues(OPT_E); + EXPECT_EQ(AL.getLastArgValue(OPT_B), "hi"); + EXPECT_EQ(AL.getLastArgValue(OPT_C), "bye"); + EXPECT_EQ(AL.getLastArgValue(OPT_D), "adena"); + std::vector<std::string> Es = AL.getAllArgValues(OPT_E); EXPECT_EQ(Es[0], "apple"); EXPECT_EQ(Es[1], "bloom"); - EXPECT_EQ(AL->getLastArgValue(OPT_F), "42"); - std::vector<std::string> Gs = AL->getAllArgValues(OPT_G); + EXPECT_EQ(AL.getLastArgValue(OPT_F), "42"); + std::vector<std::string> Gs = AL.getAllArgValues(OPT_G); EXPECT_EQ(Gs[0], "chuu"); EXPECT_EQ(Gs[1], "2"); @@ -98,11 +97,11 @@ TEST(Option, OptionParsing) { EXPECT_NE(Help.find("-A"), std::string::npos); // Test aliases. - arg_iterator Cs = AL->filtered_begin(OPT_C); - ASSERT_NE(Cs, AL->filtered_end()); + arg_iterator Cs = AL.filtered_begin(OPT_C); + ASSERT_NE(Cs, AL.filtered_end()); EXPECT_EQ(StringRef((*Cs)->getValue()), "desu"); ArgStringList ASL; - (*Cs)->render(*AL, ASL); + (*Cs)->render(AL, ASL); ASSERT_EQ(ASL.size(), 2u); EXPECT_EQ(StringRef(ASL[0]), "-C"); EXPECT_EQ(StringRef(ASL[1]), "desu"); @@ -111,30 +110,29 @@ TEST(Option, OptionParsing) { TEST(Option, ParseWithFlagExclusions) { TestOptTable T; unsigned MAI, MAC; - std::unique_ptr<InputArgList> AL; // Exclude flag3 to avoid parsing as OPT_SLASH_C. - AL.reset(T.ParseArgs(std::begin(Args), std::end(Args), MAI, MAC, - /*FlagsToInclude=*/0, - /*FlagsToExclude=*/OptFlag3)); - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_FALSE(AL->hasArg(OPT_SLASH_C)); + InputArgList AL = T.ParseArgs(Args, MAI, MAC, + /*FlagsToInclude=*/0, + /*FlagsToExclude=*/OptFlag3); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_FALSE(AL.hasArg(OPT_SLASH_C)); // Exclude flag1 to avoid parsing as OPT_C. - AL.reset(T.ParseArgs(std::begin(Args), std::end(Args), MAI, MAC, - /*FlagsToInclude=*/0, - /*FlagsToExclude=*/OptFlag1)); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_FALSE(AL->hasArg(OPT_C)); - EXPECT_TRUE(AL->hasArg(OPT_SLASH_C)); + AL = T.ParseArgs(Args, MAI, MAC, + /*FlagsToInclude=*/0, + /*FlagsToExclude=*/OptFlag1); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_FALSE(AL.hasArg(OPT_C)); + EXPECT_TRUE(AL.hasArg(OPT_SLASH_C)); const char *NewArgs[] = { "/C", "foo", "--C=bar" }; - AL.reset(T.ParseArgs(std::begin(NewArgs), std::end(NewArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_SLASH_C)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_EQ(AL->getLastArgValue(OPT_SLASH_C), "foo"); - EXPECT_EQ(AL->getLastArgValue(OPT_C), "bar"); + AL = T.ParseArgs(NewArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_SLASH_C)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_EQ(AL.getLastArgValue(OPT_SLASH_C), "foo"); + EXPECT_EQ(AL.getLastArgValue(OPT_C), "bar"); } TEST(Option, ParseAliasInGroup) { @@ -142,9 +140,8 @@ TEST(Option, ParseAliasInGroup) { unsigned MAI, MAC; const char *MyArgs[] = { "-I" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_H)); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_H)); } TEST(Option, AliasArgs) { @@ -152,11 +149,10 @@ TEST(Option, AliasArgs) { unsigned MAI, MAC; const char *MyArgs[] = { "-J", "-Joo" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_EQ(AL->getAllArgValues(OPT_B)[0], "foo"); - EXPECT_EQ(AL->getAllArgValues(OPT_B)[1], "bar"); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[0], "foo"); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[1], "bar"); } TEST(Option, IgnoreCase) { @@ -164,10 +160,9 @@ TEST(Option, IgnoreCase) { unsigned MAI, MAC; const char *MyArgs[] = { "-a", "-joo" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_B)); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_B)); } TEST(Option, DoNotIgnoreCase) { @@ -175,10 +170,9 @@ TEST(Option, DoNotIgnoreCase) { unsigned MAI, MAC; const char *MyArgs[] = { "-a", "-joo" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_FALSE(AL->hasArg(OPT_A)); - EXPECT_FALSE(AL->hasArg(OPT_B)); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_FALSE(AL.hasArg(OPT_A)); + EXPECT_FALSE(AL.hasArg(OPT_B)); } TEST(Option, SlurpEmpty) { @@ -186,11 +180,10 @@ TEST(Option, SlurpEmpty) { unsigned MAI, MAC; const char *MyArgs[] = { "-A", "-slurp" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_Slurp)); - EXPECT_EQ(AL->getAllArgValues(OPT_Slurp).size(), 0U); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_Slurp)); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp).size(), 0U); } TEST(Option, Slurp) { @@ -198,16 +191,15 @@ TEST(Option, Slurp) { unsigned MAI, MAC; const char *MyArgs[] = { "-A", "-slurp", "-B", "--", "foo" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_EQ(AL->size(), 2U); - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_FALSE(AL->hasArg(OPT_B)); - EXPECT_TRUE(AL->hasArg(OPT_Slurp)); - EXPECT_EQ(AL->getAllArgValues(OPT_Slurp).size(), 3U); - EXPECT_EQ(AL->getAllArgValues(OPT_Slurp)[0], "-B"); - EXPECT_EQ(AL->getAllArgValues(OPT_Slurp)[1], "--"); - EXPECT_EQ(AL->getAllArgValues(OPT_Slurp)[2], "foo"); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_EQ(AL.size(), 2U); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_FALSE(AL.hasArg(OPT_B)); + EXPECT_TRUE(AL.hasArg(OPT_Slurp)); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp).size(), 3U); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[0], "-B"); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[1], "--"); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[2], "foo"); } TEST(Option, FlagAliasToJoined) { @@ -216,10 +208,9 @@ TEST(Option, FlagAliasToJoined) { // Check that a flag alias provides an empty argument to a joined option. const char *MyArgs[] = { "-K" }; - std::unique_ptr<InputArgList> AL( - T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC)); - EXPECT_EQ(AL->size(), 1U); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_EQ(AL->getAllArgValues(OPT_B).size(), 1U); - EXPECT_EQ(AL->getAllArgValues(OPT_B)[0], ""); + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_EQ(AL.size(), 1U); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_EQ(AL.getAllArgValues(OPT_B).size(), 1U); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[0], ""); } diff --git a/unittests/ProfileData/InstrProfTest.cpp b/unittests/ProfileData/InstrProfTest.cpp index 26ea0e44ca42..2cedd593eb8c 100644 --- a/unittests/ProfileData/InstrProfTest.cpp +++ b/unittests/ProfileData/InstrProfTest.cpp @@ -68,6 +68,7 @@ TEST_F(InstrProfTest, write_and_read_one_function) { TEST_F(InstrProfTest, get_function_counts) { Writer.addFunctionCounts("foo", 0x1234, {1, 2}); + Writer.addFunctionCounts("foo", 0x1235, {3, 4}); auto Profile = Writer.writeBuffer(); readProfile(std::move(Profile)); @@ -77,6 +78,11 @@ TEST_F(InstrProfTest, get_function_counts) { ASSERT_EQ(1U, Counts[0]); ASSERT_EQ(2U, Counts[1]); + ASSERT_TRUE(NoError(Reader->getFunctionCounts("foo", 0x1235, Counts))); + ASSERT_EQ(2U, Counts.size()); + ASSERT_EQ(3U, Counts[0]); + ASSERT_EQ(4U, Counts[1]); + std::error_code EC; EC = Reader->getFunctionCounts("foo", 0x5678, Counts); ASSERT_TRUE(ErrorEquals(instrprof_error::hash_mismatch, EC)); diff --git a/unittests/Transforms/Utils/Cloning.cpp b/unittests/Transforms/Utils/Cloning.cpp index 18d3ca626753..e2671499e812 100644 --- a/unittests/Transforms/Utils/Cloning.cpp +++ b/unittests/Transforms/Utils/Cloning.cpp @@ -415,4 +415,39 @@ TEST_F(CloneFunc, DebugIntrinsics) { } } +class CloneModule : public ::testing::Test { +protected: + void SetUp() override { + SetupModule(); + CreateOldModule(); + CreateNewModule(); + } + + void SetupModule() { OldM = new Module("", C); } + + void CreateOldModule() { + IRBuilder<> IBuilder(C); + + auto *FuncType = FunctionType::get(Type::getVoidTy(C), false); + auto *PersFn = Function::Create(FuncType, GlobalValue::ExternalLinkage, + "persfn", OldM); + auto *F = + Function::Create(FuncType, GlobalValue::PrivateLinkage, "f", OldM); + F->setPersonalityFn(PersFn); + auto *Entry = BasicBlock::Create(C, "", F); + IBuilder.SetInsertPoint(Entry); + IBuilder.CreateRetVoid(); + } + + void CreateNewModule() { NewM = llvm::CloneModule(OldM); } + + LLVMContext C; + Module *OldM; + Module *NewM; +}; + +TEST_F(CloneModule, Verify) { + EXPECT_FALSE(verifyModule(*NewM)); +} + } |
