1 //===- unittest/IceParseTypesTest.cpp -------------------------------------===//
2 // Tests parser for PNaCl bitcode.
3 //
4 // The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 // Tests record errors in the types block when parsing PNaCl bitcode.
12
13 // TODO(kschimpf) Add more tests.
14
15 #include "BitcodeMunge.h"
16 #include "unittests/Bitcode/NaClMungeTest.h"
17
18 using namespace llvm;
19 using namespace naclmungetest;
20 using namespace IceTest;
21
22 namespace {
23
24 static const unsigned NO_LOCAL_ABBREVS =
25 NaClBitsNeededForValue(naclbitc::DEFAULT_MAX_ABBREV);
26
27 const uint64_t BitcodeRecords[] = {
28 naclbitc::ENTER_SUBBLOCK, naclbitc::BLK_CODE_ENTER,
29 naclbitc::MODULE_BLOCK_ID, NO_LOCAL_ABBREVS, Terminator,
30 naclbitc::ENTER_SUBBLOCK, naclbitc::BLK_CODE_ENTER,
31 naclbitc::TYPE_BLOCK_ID_NEW, NO_LOCAL_ABBREVS, Terminator,
32 naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator,
33 naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
34 naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_FLOAT, Terminator,
35 naclbitc::END_BLOCK, naclbitc::BLK_CODE_EXIT, Terminator,
36 naclbitc::END_BLOCK, naclbitc::BLK_CODE_EXIT, Terminator};
37
38 const char *ExpectedDump =
39 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
40 "88, 69)\n"
41 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
42 " | 0> |\n"
43 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
44 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
45 " 32:0| 3: <1, 2> | count 2;\n"
46 " 34:4| 3: <7, 32> | @t0 = i32;\n"
47 " 37:6| 3: <3> | @t1 = float;\n"
48 " 39:4| 0: <65534> | }\n"
49 " 40:0|0: <65534> |}\n";
50
TEST(NaClParseTypesTest,ShowExpectedDump)51 TEST(NaClParseTypesTest, ShowExpectedDump) {
52 NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords));
53 EXPECT_TRUE(Munger.runTest());
54 EXPECT_EQ(ExpectedDump, Munger.getTestResults());
55 }
56
57 // Show what happens when misdefining: @t1 = float"
TEST(NaClParseTypesTest,BadFloatTypeDefinition)58 TEST(NaClParseTypesTest, BadFloatTypeDefinition) {
59 // Index for "@t1 = float;" record.
60 const uint64_t FloatTypeIndex = 4;
61 const uint64_t Edit[] = {FloatTypeIndex, NaClMungedBitcode::Replace,
62 // Add extraneous 1 to end of float record.
63 naclbitc::UNABBREV_RECORD, naclbitc::TYPE_CODE_FLOAT,
64 1, Terminator};
65
66 SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
67 EXPECT_FALSE(Munger.runTest(ARRAY(Edit)));
68 EXPECT_EQ("Error(37:6): Invalid type record: <3 1>\n",
69 Munger.getTestResults());
70 }
71
72 // Show what happens when the count record value is way too big.
73 // See: https://code.google.com/p/nativeclient/issues/detail?id=4195
TEST(NaClParseTypesTest,BadTypeCountRecord)74 TEST(NaClParseTypesTest, BadTypeCountRecord) {
75 // Index for "count 2;".
76 const uint64_t CountRecordIndex = 2;
77 const uint64_t Edit[] = {
78 CountRecordIndex, NaClMungedBitcode::Replace, naclbitc::UNABBREV_RECORD,
79 naclbitc::TYPE_CODE_NUMENTRY, 18446744073709547964ULL, Terminator};
80
81 SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
82 Munger.Flags.setGenerateUnitTestMessages(false);
83 EXPECT_FALSE(Munger.runTest(ARRAY(Edit)));
84 EXPECT_EQ("Error(32:0): Size to big for count record: 18446744073709547964\n"
85 "Error(48:4): Types block expected 4294963644 types but found: 2\n",
86 Munger.getTestResults());
87 }
88
89 } // end of anonymous namespace
90