OLD | NEW |
---|---|
(Empty) | |
1 //===- unittest/NaClParseTypesTest.cpp ------------------------------------===// | |
Jim Stichnoth
2015/06/22 22:48:09
You may want to add this file to FORMAT_BLACKLIST
Karl
2015/06/23 18:05:36
Done. Also fixed comment above.
| |
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 | |
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" | |
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 | |
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 | |
OLD | NEW |