| Index: unittests/Bitcode/NaClObjDumpTest.cpp
|
| diff --git a/unittests/Bitcode/NaClObjDumpTest.cpp b/unittests/Bitcode/NaClObjDumpTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d685e7880a47c6bb3dc09beabe24899bde27a626
|
| --- /dev/null
|
| +++ b/unittests/Bitcode/NaClObjDumpTest.cpp
|
| @@ -0,0 +1,789 @@
|
| +//===- llvm/unittest/Bitcode/NaClObjDumpTest.cpp -------------------------===//
|
| +// Tests objdump stream for PNaCl bitcode.
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is distributed under the University of Illinois Open Source
|
| +// License. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +// Tests if the objdump stream for PNaCl bitcode works as expected.
|
| +
|
| +#include "llvm/Bitcode/NaCl/NaClObjDumpStream.h"
|
| +
|
| +#include "gtest/gtest.h"
|
| +
|
| +#include <iostream>
|
| +
|
| +using namespace llvm;
|
| +using namespace llvm::naclbitc;
|
| +
|
| +namespace {
|
| +
|
| +// Writes out the record, if non-null. Otherwise just writes comments
|
| +// and errors.
|
| +static inline void Write(ObjDumpStream &Stream, uint64_t Bit,
|
| + const NaClBitcodeRecordData *Record,
|
| + int32_t AbbrevIndex) {
|
| + if (Record)
|
| + Stream.Write(Bit, *Record, AbbrevIndex);
|
| + else
|
| + Stream.Flush();
|
| +}
|
| +
|
| +// Runs some simple assembly examples against the given bitcode
|
| +// record, using an objdump stream.
|
| +static void RunAssemblyExamples(
|
| + ObjDumpStream &Stream, uint64_t Bit,
|
| + const NaClBitcodeRecordData *Record,
|
| + int32_t AbbrevIndex,
|
| + bool AddErrors) {
|
| +
|
| + // First assume no assembly.
|
| + if (AddErrors)
|
| + Stream.Error(Bit) << "This is an error\n";
|
| + Write(Stream, Bit, Record, AbbrevIndex);
|
| + // Increment bit to new fictitious address, assuming Record takes 21 bits.
|
| + Bit += 21;
|
| +
|
| + // Now a single line assembly.
|
| + if (AddErrors)
|
| + Stream.Error(Bit) << "Oops, an error!\n";
|
| + Stream.Assembly() << "One line assembly.";
|
| + Write(Stream, Bit, Record, AbbrevIndex);
|
| + // Increment bit to new fictitious address, assuming Record takes 17 bits.
|
| + Bit += 17;
|
| +
|
| + // Now multiple line assembly.
|
| + if (AddErrors)
|
| + Stream.Error(Bit) << "The record looks bad\n";
|
| + Stream.Assembly() << "Two Line\nexample assembly.";
|
| + if (AddErrors)
|
| + Stream.Error(Bit) << "Actually, it looks really bad\n";
|
| + Write(Stream, Bit, Record, AbbrevIndex);
|
| +}
|
| +
|
| +// Runs some simple assembly examples against the given bitcode record
|
| +// using an objdump stream. Adds a message describing the test
|
| +// and the record indent being used.
|
| +static std::string RunIndentedAssemblyWithAbbrevTest(
|
| + bool DumpRecords, bool DumpAssembly,
|
| + unsigned NumRecordIndents, uint64_t Bit,
|
| + const NaClBitcodeRecordData *Record, int32_t AbbrevIndex, bool AddErrors) {
|
| + std::string Buffer;
|
| + raw_string_ostream BufStream(Buffer);
|
| + ObjDumpStream DumpStream(BufStream, DumpRecords, DumpAssembly);
|
| + for (unsigned i = 0; i < NumRecordIndents; ++i) {
|
| + DumpStream.IncRecordIndent();
|
| + }
|
| + RunAssemblyExamples(DumpStream, Bit, Record, AbbrevIndex, AddErrors);
|
| + return BufStream.str();
|
| +}
|
| +
|
| +// Runs some simple assembly examples against the given bitcode record
|
| +// using an objdump stream. Adds a message describing the test
|
| +// and the record indent being used. Assumes no abbreviation index
|
| +// is associated with the record.
|
| +static std::string RunIndentedAssemblyTest(
|
| + bool DumpRecords, bool DumpAssembly,
|
| + unsigned NumRecordIndents, uint64_t Bit,
|
| + const NaClBitcodeRecordData *Record, bool AddErrors) {
|
| + return
|
| + RunIndentedAssemblyWithAbbrevTest(
|
| + DumpRecords, DumpAssembly, NumRecordIndents, Bit, Record,
|
| + naclbitc::ABBREV_INDEX_NOT_SPECIFIED, AddErrors);
|
| +}
|
| +
|
| +// Tests effects of objdump when there isn't a record to write.
|
| +TEST(NaClObjDumpTest, NoDumpRecords) {
|
| + EXPECT_EQ(
|
| + " | |One line assembly.\n"
|
| + " | |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 11, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(true, false, 0, 37, 0, false));
|
| +
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64, 0, false));
|
| +}
|
| +
|
| +// Tests simple cases where there is both a record and corresponding
|
| +// assembly code.
|
| +TEST(NaClObjDumpTest, SimpleRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(10);
|
| + Record.Values.push_back(15);
|
| +
|
| + EXPECT_EQ(
|
| + " 1:3|<5, 10, 15> |\n"
|
| + " 4:0|<5, 10, 15> |One line assembly.\n"
|
| + " 6:1|<5, 10, 15> |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 11, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 4:5|<5, 10, 15>\n"
|
| + " 7:2|<5, 10, 15>\n"
|
| + " 9:3|<5, 10, 15>\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 37, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64, &Record, false));
|
| +}
|
| +
|
| +// Test case where record is printed using two lines.
|
| +TEST(NaClObjDumpText, LongRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056> |\n"
|
| + " 129:6|<5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056> |\n"
|
| + " 131:7|<5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056> |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + " 47076:3|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + " 47078:4|<5, 18446744073709551615, 100, 15, 107056>\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, false));
|
| +}
|
| +
|
| +// Test case where comma hits boundary.
|
| +TEST(NaClObjDumpText, CommaBoundaryRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(10);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, 10,|\n"
|
| + " | 15, 107056> |\n"
|
| + " 129:6|<5, 18446744073709551615, 10,|One line assembly.\n"
|
| + " | 15, 107056> |\n"
|
| + " 131:7|<5, 18446744073709551615, 10,|Two Line\n"
|
| + " | 15, 107056> |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6|<5, 18446744073709551615, 10, 15, 107056>\n"
|
| + " 47076:3|<5, 18446744073709551615, 10, 15, 107056>\n"
|
| + " 47078:4|<5, 18446744073709551615, 10, 15, 107056>\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, false));
|
| +}
|
| +
|
| +// Test case where comma wraps to next line.
|
| +TEST(NaClObjDumpText, CommaWrapRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056> |\n"
|
| + " 129:6|<5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056> |\n"
|
| + " 131:7|<5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056> |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + " 47076:3|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + " 47078:4|<5, 18446744073709551615, 100, 15, 107056>\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, false));
|
| +}
|
| +
|
| +// Test case where record is printed using more than two lines.
|
| +TEST(NaClObjDumpText, VeryLongRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| + Record.Values.push_back(static_cast<uint64_t>(-5065));
|
| + Record.Values.push_back(101958788);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 129:6|<5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 131:7|<5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056, |example assembly.\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| +" 47073:6|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +" 47076:3|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +" 47078:4|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, false));
|
| +}
|
| +
|
| +
|
| +// Tests effects of objdump when there isn't a record to write, but errors occur.
|
| +TEST(NaClObjDumpTest, ErrorsErrorsNoDumpRecords) {
|
| +
|
| + EXPECT_EQ(
|
| + "Error(1:3): This is an error\n"
|
| + " | |One line assembly.\n"
|
| + "Error(4:0): Oops, an error!\n"
|
| + " | |Two Line\n"
|
| + " | |example assembly.\n"
|
| + "Error(6:1): The record looks bad\n"
|
| + "Error(6:1): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 11, 0, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(11:3): This is an error\n"
|
| + "One line assembly.\n"
|
| + "Error(14:0): Oops, an error!\n"
|
| + "Two Line\n"
|
| + "example assembly.\n"
|
| + "Error(16:1): The record looks bad\n"
|
| + "Error(16:1): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, 0, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(4:5): This is an error\n"
|
| + "Error(7:2): Oops, an error!\n"
|
| + "Error(9:3): The record looks bad\n"
|
| + "Error(9:3): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 37, 0, true));
|
| +
|
| +
|
| + EXPECT_EQ(
|
| + "Error(8:0): This is an error\n"
|
| + "Error(10:5): Oops, an error!\n"
|
| + "Error(12:6): The record looks bad\n"
|
| + "Error(12:6): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, false, 0, 64, 0, true));
|
| +}
|
| +
|
| +// Test case where record is printed using two lines, but errors
|
| +// occur.
|
| +TEST(NaClObjDumpText, ErrorsLongRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056> |\n"
|
| + "Error(127:1): This is an error\n"
|
| + " 129:6|<5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056> |\n"
|
| + "Error(129:6): Oops, an error!\n"
|
| + " 131:7|<5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056> |example assembly.\n"
|
| + "Error(131:7): The record looks bad\n"
|
| + "Error(131:7): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(11:3): This is an error\n"
|
| + "One line assembly.\n"
|
| + "Error(14:0): Oops, an error!\n"
|
| + "Two Line\n"
|
| + "example assembly.\n"
|
| + "Error(16:1): The record looks bad\n"
|
| + "Error(16:1): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + "Error(47073:6): This is an error\n"
|
| + " 47076:3|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + "Error(47076:3): Oops, an error!\n"
|
| + " 47078:4|<5, 18446744073709551615, 100, 15, 107056>\n"
|
| + "Error(47078:4): The record looks bad\n"
|
| + "Error(47078:4): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(8070:4): This is an error\n"
|
| + "Error(8073:1): Oops, an error!\n"
|
| + "Error(8075:2): The record looks bad\n"
|
| + "Error(8075:2): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, true));
|
| +
|
| +}
|
| +
|
| +// Test case where record is printed using more than two lines, but
|
| +// errors occur.
|
| +TEST(NaClObjDumpText, ErrorsVeryLongRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| + Record.Values.push_back(static_cast<uint64_t>(-5065));
|
| + Record.Values.push_back(101958788);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|<5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + "Error(127:1): This is an error\n"
|
| + " 129:6|<5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + "Error(129:6): Oops, an error!\n"
|
| + " 131:7|<5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056, |example assembly.\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + "Error(131:7): The record looks bad\n"
|
| + "Error(131:7): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, true, 0, 1017, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(11:3): This is an error\n"
|
| + "One line assembly.\n"
|
| + "Error(14:0): Oops, an error!\n"
|
| + "Two Line\n"
|
| + "example assembly.\n"
|
| + "Error(16:1): The record looks bad\n"
|
| + "Error(16:1): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, true, 0, 91, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| +" 47073:6|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +"Error(47073:6): This is an error\n"
|
| +" 47076:3|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +"Error(47076:3): Oops, an error!\n"
|
| +" 47078:4|<5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +"Error(47078:4): The record looks bad\n"
|
| +"Error(47078:4): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(true, false, 0, 376590, &Record, true));
|
| +
|
| + EXPECT_EQ(
|
| + "Error(8070:4): This is an error\n"
|
| + "Error(8073:1): Oops, an error!\n"
|
| + "Error(8075:2): The record looks bad\n"
|
| + "Error(8075:2): Actually, it looks really bad\n",
|
| + RunIndentedAssemblyTest(false, false, 0, 64564, &Record, true));
|
| +}
|
| +
|
| +// Tests effects of objdump when there isn't a record to write, and we indent.
|
| +TEST(NaClObjDumpTest, NoDumpIndentRecords) {
|
| +
|
| + EXPECT_EQ(
|
| + " | |One line assembly.\n"
|
| + " | |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 1, 11, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + " | |One line assembly.\n"
|
| + " | |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 2, 11, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 1, 91, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 2, 91, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(true, false, 1, 37, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(true, false, 2, 37, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 1, 64, 0, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 2, 64, 0, false));
|
| +}
|
| +
|
| +// Tests simple cases where there is both a record and corresponding
|
| +// assembly code, and the records are indented.
|
| +TEST(NaClObjDumpTest, SimpleIndentRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(10);
|
| + Record.Values.push_back(15);
|
| +
|
| + EXPECT_EQ(
|
| + " 1:3| <5, 10, 15> |\n"
|
| + " 4:0| <5, 10, 15> |One line assembly.\n"
|
| + " 6:1| <5, 10, 15> |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 1, 11, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 1:3| <5, 10, 15> |\n"
|
| + " 4:0| <5, 10, 15> |One line assembly.\n"
|
| + " 6:1| <5, 10, 15> |Two Line\n"
|
| + " | |example assembly.\n",
|
| + RunIndentedAssemblyTest(true, true, 2, 11, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 1, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 2, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 4:5| <5, 10, 15>\n"
|
| + " 7:2| <5, 10, 15>\n"
|
| + " 9:3| <5, 10, 15>\n",
|
| + RunIndentedAssemblyTest(true, false, 1, 37, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 4:5| <5, 10, 15>\n"
|
| + " 7:2| <5, 10, 15>\n"
|
| + " 9:3| <5, 10, 15>\n",
|
| + RunIndentedAssemblyTest(true, false, 2, 37, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 1, 64, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 2, 64, &Record, false));
|
| +
|
| +}
|
| +
|
| +// Test case where record is printed using more than two lines.
|
| +TEST(NaClObjDumpText, VeryLongIndentRecords) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| + Record.Values.push_back(static_cast<uint64_t>(-5065));
|
| + Record.Values.push_back(101958788);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1| <5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 129:6| <5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 131:7| <5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056, |example assembly.\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyTest(true, true, 1, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1| <5, |\n"
|
| + " | 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 129:6| <5, |One line assembly.\n"
|
| + " | 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 131:7| <5, |Two Line\n"
|
| + " | 18446744073709551615, |example assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyTest(true, true, 3, 1017, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 1, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyTest(false, true, 2, 91, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| +" 47073:6| <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +" 47076:3| <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n"
|
| +" 47078:4| <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551, \n"
|
| +" | 101958788>\n",
|
| + RunIndentedAssemblyTest(true, false, 1, 376590, &Record, false));
|
| +
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6| <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n"
|
| + " 47076:3| <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n"
|
| + " 47078:4| <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n",
|
| + RunIndentedAssemblyTest(true, false, 5, 376590, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 1, 64564, &Record, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyTest(false, false, 2, 64564, &Record, false));
|
| +}
|
| +
|
| +// Tests that Clustering doesn't effect (intraline) indenting.
|
| +TEST(NaClObjDumpTest, ClusterIndentInteraction) {
|
| + std::string Buffer;
|
| + raw_string_ostream BufStream(Buffer);
|
| + ObjDumpStream Stream(BufStream, true, true);
|
| +
|
| + TextFormatter Formatter(Stream.Assembly(), 40, " ");
|
| + TokenTextDirective Comma(&Formatter, ",");
|
| + SpaceTextDirective Space(&Formatter);
|
| + OpenTextDirective OpenParen(&Formatter, "(");
|
| + CloseTextDirective CloseParen(&Formatter, ")");
|
| + StartClusteringDirective StartCluster(&Formatter);
|
| + FinishClusteringDirective FinishCluster(&Formatter);
|
| + EndlineTextDirective Endline(&Formatter);
|
| +
|
| + Formatter.Tokens() << "begin" << Space;
|
| + // Generates text on single line, setting indent at "(".
|
| + Formatter.Tokens()
|
| + << StartCluster << "SomeReasonablylongText" << OpenParen << FinishCluster;
|
| + // Generates a long cluster that should move to the next line.
|
| + Formatter.Tokens()
|
| + << StartCluster << "ThisIsBoring" << Space
|
| + << "VeryBoring" << Space << "longggggggggggggggggg"
|
| + << Space << "Example" << Comma << FinishCluster;
|
| + Formatter.Tokens() << CloseParen << Comma << Endline;
|
| + Stream.Flush();
|
| + EXPECT_EQ(
|
| +" | |begin SomeReasonablylongText(\n"
|
| +" | | ThisIsBoring \n"
|
| +" | | VeryBoring \n"
|
| +" | | longggggggggggggggggg\n"
|
| +" | | Example,),\n",
|
| +BufStream.str());
|
| +}
|
| +
|
| +// Tests the insertion of an abbreviation index.
|
| +TEST(NaClObjDumpTest, UseOfAbbrevationIndex) {
|
| + NaClBitcodeRecordData Record;
|
| + Record.Code = 5;
|
| + Record.Values.push_back(static_cast<uint64_t>(-1));
|
| + Record.Values.push_back(100);
|
| + Record.Values.push_back(15);
|
| + Record.Values.push_back(107056);
|
| + Record.Values.push_back(static_cast<uint64_t>(-5065));
|
| + Record.Values.push_back(101958788);
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1|3: <5, 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 129:6|3: <5, 18446744073709551615, |One line assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 131:7|3: <5, 18446744073709551615, |Two Line\n"
|
| + " | 100, 15, 107056, |example assembly.\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyWithAbbrevTest(true, true, 0, 1017, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1| 3: <5, |\n"
|
| + " | 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 129:6| 3: <5, |One line assembly.\n"
|
| + " | 18446744073709551615, |\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n"
|
| + " 131:7| 3: <5, |Two Line\n"
|
| + " | 18446744073709551615, |example assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551, |\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyWithAbbrevTest(true, true, 1, 1017, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + " 127:1| 3: <5, |\n"
|
| + " | 18446744073709551615,|\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551,|\n"
|
| + " | 101958788> |\n"
|
| + " 129:6| 3: <5, |One line assembly.\n"
|
| + " | 18446744073709551615,|\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551,|\n"
|
| + " | 101958788> |\n"
|
| + " 131:7| 3: <5, |Two Line\n"
|
| + " | 18446744073709551615,|example assembly.\n"
|
| + " | 100, 15, 107056, |\n"
|
| + " | 18446744073709546551,|\n"
|
| + " | 101958788> |\n",
|
| + RunIndentedAssemblyWithAbbrevTest(true, true, 3, 1017, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyWithAbbrevTest(false, true, 1, 91, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + "One line assembly.\n"
|
| + "Two Line\n"
|
| + "example assembly.\n",
|
| + RunIndentedAssemblyWithAbbrevTest(false, true, 2, 91, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| +" 47073:6| 3: <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551,\n"
|
| +" | 101958788>\n"
|
| +" 47076:3| 3: <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551,\n"
|
| +" | 101958788>\n"
|
| +" 47078:4| 3: <5, 18446744073709551615, 100, 15, 107056, 18446744073709546551,\n"
|
| +" | 101958788>\n",
|
| + RunIndentedAssemblyWithAbbrevTest(true, false, 1, 376590, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| +
|
| + EXPECT_EQ(
|
| + " 47073:6| 3: <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n"
|
| + " 47076:3| 3: <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n"
|
| + " 47078:4| 3: <5, 18446744073709551615, 100, 15, 107056, \n"
|
| + " | 18446744073709546551, 101958788>\n",
|
| + RunIndentedAssemblyWithAbbrevTest(true, false, 5, 376590, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyWithAbbrevTest(false, false, 1, 64564, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +
|
| + EXPECT_EQ(
|
| + "",
|
| + RunIndentedAssemblyWithAbbrevTest(false, false, 2, 64564, &Record,
|
| + naclbitc::UNABBREV_RECORD, false));
|
| +}
|
| +
|
| +}
|
|
|