Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
swiftshader
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
swiftshader
Commits
af238b25
Commit
af238b25
authored
Jan 20, 2015
by
Karl Schimpf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add instruction alignment tests to unit tests.
BUG=None R=jvoung@chromium.org, stichnot@chromium.org Review URL:
https://codereview.chromium.org/848473002
parent
769be681
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
426 additions
and
4 deletions
+426
-4
PNaClTranslator.cpp
src/PNaClTranslator.cpp
+3
-3
IceParseInstsTest.cpp
unittest/IceParseInstsTest.cpp
+423
-1
No files found.
src/PNaClTranslator.cpp
View file @
af238b25
...
...
@@ -1174,18 +1174,18 @@ private:
}
// Extracts the corresponding Alignment to use, given the AlignPower
// (i.e. 2**
AlignPower
, or 0 if AlignPower == 0). InstName is the
// (i.e. 2**
(AlignPower-1)
, or 0 if AlignPower == 0). InstName is the
// name of the instruction the alignment appears in.
void
extractAlignment
(
const
char
*
InstName
,
uint32_t
AlignPower
,
uint32_t
&
Alignment
)
{
if
(
AlignPower
<=
AlignPowerLimit
)
{
if
(
AlignPower
<=
AlignPowerLimit
+
1
)
{
Alignment
=
(
1
<<
AlignPower
)
>>
1
;
return
;
}
std
::
string
Buffer
;
raw_string_ostream
StrBuf
(
Buffer
);
StrBuf
<<
InstName
<<
" alignment greater than 2**"
<<
AlignPowerLimit
<<
". Found: 2**"
<<
AlignPower
;
<<
". Found: 2**"
<<
(
AlignPower
-
1
)
;
Error
(
StrBuf
.
str
());
// Error recover with value that is always acceptable.
Alignment
=
1
;
...
...
unittest/IceParseInstsTest.cpp
View file @
af238b25
...
...
@@ -21,6 +21,12 @@ namespace {
static
const
uint64_t
Terminator
=
0x5768798008978675LL
;
// Note: alignment stored as 0 or log2(Alignment)+1.
uint64_t
getEncAlignPower
(
unsigned
Power
)
{
return
Power
+
1
;
}
uint64_t
getEncAlignZero
()
{
return
0
;
}
/// Test how we report a call arg that refers to nonexistent call argument
TEST
(
IceParseInstsTest
,
NonexistentCallArg
)
{
const
uint64_t
BitcodeRecords
[]
=
{
...
...
@@ -42,7 +48,6 @@ TEST(IceParseInstsTest, NonexistentCallArg) {
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
};
// Show bitcode objdump for BitcodeRecords.
NaClObjDumpMunger
DumpMunger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
...
...
@@ -76,4 +81,421 @@ TEST(IceParseInstsTest, NonexistentCallArg) {
Munger
.
getTestResults
());
}
/// Test how we recognize alignments in alloca instructions.
TEST
(
IceParseInstsTests
,
AllocaAlignment
)
{
const
uint64_t
BitcodeRecords
[]
=
{
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
MODULE_BLOCK_ID
,
2
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
TYPE_BLOCK_ID_NEW
,
2
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_NUMENTRY
,
4
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_INTEGER
,
32
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_VOID
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FUNCTION
,
0
,
1
,
0
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_INTEGER
,
8
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
3
,
naclbitc
::
MODULE_CODE_FUNCTION
,
2
,
0
,
0
,
0
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
FUNCTION_BLOCK_ID
,
2
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_DECLAREBLOCKS
,
1
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_ALLOCA
,
1
,
getEncAlignPower
(
0
),
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_RET
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
};
const
uint64_t
ReplaceIndex
=
11
;
// index for FUNC_CODE_INST_ALLOCA
// Show text when alignment is 1.
NaClObjDumpMunger
DumpMunger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good alloca alignment 1"
));
EXPECT_EQ
(
"module { // BlockID = 8
\n
"
" types { // BlockID = 17
\n
"
" count 4;
\n
"
" @t0 = i32;
\n
"
" @t1 = void;
\n
"
" @t2 = void (i32);
\n
"
" @t3 = i8;
\n
"
" }
\n
"
" define external void @f0(i32);
\n
"
" function void @f0(i32 %p0) { // BlockID = 12
\n
"
" blocks 1;
\n
"
" %b0:
\n
"
" %v0 = alloca i8, i32 %p0, align 1;
\n
"
" ret void;
\n
"
" }
\n
"
"}
\n
"
,
DumpMunger
.
getTestResults
());
// Show that we can handle alignment of 1.
IceTest
::
SubzeroBitcodeMunger
Munger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
Munger
.
runTest
(
"Good alloca alignment 1"
));
// Show what happens when changing alignment to 0.
const
uint64_t
Align0
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_ALLOCA
,
1
,
getEncAlignZero
(),
Terminator
,
};
EXPECT_TRUE
(
Munger
.
runTest
(
"Good alloca alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good alloca alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
" %v0 = alloca i8, i32 %p0, align 0;
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"alloca"
));
// Show what happens when changing alignment to 2**30.
const
uint64_t
Align30
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_ALLOCA
,
1
,
getEncAlignPower
(
30
),
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad alloca alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
"Error: (62:4) Invalid function record: <19 1 31>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad alloca alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
" %v0 = alloca i8, i32 %p0, align 0;
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"alloca"
));
EXPECT_EQ
(
"Error(62:4): Alignment can't be greater than 2**29. Found: 2**30
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"Error"
));
// Show what happens when changing alignment to 2**29.
const
uint64_t
Align29
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_ALLOCA
,
1
,
getEncAlignPower
(
29
),
Terminator
,
};
EXPECT_TRUE
(
Munger
.
runTest
(
"Good alloca alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good alloca alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
" %v0 = alloca i8, i32 %p0, align 536870912;
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"alloca"
));
}
// Test how we recognize alignments in load i32 instructions.
TEST
(
IceParseInstsTests
,
LoadI32Alignment
)
{
const
uint64_t
BitcodeRecords
[]
=
{
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
MODULE_BLOCK_ID
,
2
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
TYPE_BLOCK_ID_NEW
,
2
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_NUMENTRY
,
2
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_INTEGER
,
32
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FUNCTION
,
0
,
0
,
0
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
3
,
naclbitc
::
MODULE_CODE_FUNCTION
,
1
,
0
,
0
,
0
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
FUNCTION_BLOCK_ID
,
2
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_DECLAREBLOCKS
,
1
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
0
),
0
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_RET
,
1
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
};
const
uint64_t
ReplaceIndex
=
9
;
// index for FUNC_CODE_INST_LOAD
// Show text when alignment is 1.
NaClObjDumpMunger
DumpMunger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good load i32 alignment 1"
));
EXPECT_EQ
(
"module { // BlockID = 8
\n
"
" types { // BlockID = 17
\n
"
" count 2;
\n
"
" @t0 = i32;
\n
"
" @t1 = i32 (i32);
\n
"
" }
\n
"
" define external i32 @f0(i32);
\n
"
" function i32 @f0(i32 %p0) { // BlockID = 12
\n
"
" blocks 1;
\n
"
" %b0:
\n
"
" %v0 = load i32* %p0, align 1;
\n
"
" ret i32 %v0;
\n
"
" }
\n
"
"}
\n
"
,
DumpMunger
.
getTestResults
());
IceTest
::
SubzeroBitcodeMunger
Munger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
Munger
.
runTest
(
"Good load i32 alignment 1"
));
// Show what happens when changing alignment to 0.
const
uint64_t
Align0
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignZero
(),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load i32 alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 0 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load i32 alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
" %v0 = load i32* %p0, align 0;
\n
"
"Error(58:4): load: Illegal alignment for i32. Expects: 1
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
// Show what happens when changing alignment to 4.
const
uint64_t
Align4
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
2
),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load i32 alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 3 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load i32 alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
EXPECT_EQ
(
" %v0 = load i32* %p0, align 4;
\n
"
"Error(58:4): load: Illegal alignment for i32. Expects: 1
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
// Show what happens when changing alignment to 2**29.
const
uint64_t
Align29
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
29
),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load i32 alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 30 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load i32 alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
" %v0 = load i32* %p0, align 536870912;
\n
"
"Error(58:4): load: Illegal alignment for i32. Expects: 1
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
// Show what happens when changing alignment to 2**30.
const
uint64_t
Align30
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
30
),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load i32 alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 31 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load i32 alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
" %v0 = load i32* %p0, align 0;
\n
"
"Error(58:4): load: Illegal alignment for i32. Expects: 1
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
}
// Test how we recognize alignments in load float instructions.
TEST
(
IceParseInstsTests
,
LoadFloatAlignment
)
{
const
uint64_t
BitcodeRecords
[]
=
{
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
MODULE_BLOCK_ID
,
2
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
TYPE_BLOCK_ID_NEW
,
2
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_NUMENTRY
,
3
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FLOAT
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_INTEGER
,
32
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FUNCTION
,
0
,
0
,
1
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
3
,
naclbitc
::
MODULE_CODE_FUNCTION
,
2
,
0
,
0
,
0
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
FUNCTION_BLOCK_ID
,
2
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_DECLAREBLOCKS
,
1
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
0
),
0
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_RET
,
1
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
};
const
uint64_t
ReplaceIndex
=
10
;
// index for FUNC_CODE_INST_LOAD
// Show text when alignment is 1.
NaClObjDumpMunger
DumpMunger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good load float alignment 1"
));
EXPECT_EQ
(
"module { // BlockID = 8
\n
"
" types { // BlockID = 17
\n
"
" count 3;
\n
"
" @t0 = float;
\n
"
" @t1 = i32;
\n
"
" @t2 = float (i32);
\n
"
" }
\n
"
" define external float @f0(i32);
\n
"
" function float @f0(i32 %p0) { // BlockID = 12
\n
"
" blocks 1;
\n
"
" %b0:
\n
"
" %v0 = load float* %p0, align 1;
\n
"
" ret float %v0;
\n
"
" }
\n
"
"}
\n
"
,
DumpMunger
.
getTestResults
());
IceTest
::
SubzeroBitcodeMunger
Munger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
Munger
.
runTest
(
"Good load float alignment 1"
));
// Show what happens when changing alignment to 0.
const
uint64_t
Align0
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignZero
(),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load float alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 0 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load float alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
" %v0 = load float* %p0, align 0;
\n
"
"Error(58:4): load: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
// Show what happens when changing alignment to 4.
const
uint64_t
Align4
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
2
),
0
,
Terminator
,
};
EXPECT_TRUE
(
Munger
.
runTest
(
"Good load float alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good load float alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
EXPECT_EQ
(
" %v0 = load float* %p0, align 4;
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
const
uint64_t
Align29
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
29
),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load float alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 30 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load float alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
" %v0 = load float* %p0, align 536870912;
\n
"
"Error(58:4): load: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
// Show what happens when changing alignment to 2**30.
const
uint64_t
Align30
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_LOAD
,
1
,
getEncAlignPower
(
30
),
0
,
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad load float alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
"Error: (58:4) Invalid function record: <20 1 31 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad load float alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
" %v0 = load float* %p0, align 0;
\n
"
"Error(58:4): load: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"load"
));
}
// Test how we recognize alignments in store instructions.
TEST
(
NaClParseInstsTests
,
StoreAlignment
)
{
const
uint64_t
BitcodeRecords
[]
=
{
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
MODULE_BLOCK_ID
,
2
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
TYPE_BLOCK_ID_NEW
,
2
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_NUMENTRY
,
3
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FLOAT
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_INTEGER
,
32
,
Terminator
,
3
,
naclbitc
::
TYPE_CODE_FUNCTION
,
0
,
0
,
1
,
0
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
3
,
naclbitc
::
MODULE_CODE_FUNCTION
,
2
,
0
,
0
,
0
,
Terminator
,
1
,
naclbitc
::
BLK_CODE_ENTER
,
naclbitc
::
FUNCTION_BLOCK_ID
,
2
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_DECLAREBLOCKS
,
1
,
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignPower
(
0
),
Terminator
,
3
,
naclbitc
::
FUNC_CODE_INST_RET
,
1
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
,
0
,
naclbitc
::
BLK_CODE_EXIT
,
Terminator
};
const
uint64_t
ReplaceIndex
=
10
;
// index for FUNC_CODE_INST_STORE
// Show text when alignment is 1.
NaClObjDumpMunger
DumpMunger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good Store Alignment 1"
));
EXPECT_EQ
(
"module { // BlockID = 8
\n
"
" types { // BlockID = 17
\n
"
" count 3;
\n
"
" @t0 = float;
\n
"
" @t1 = i32;
\n
"
" @t2 = float (i32, float);
\n
"
" }
\n
"
" define external float @f0(i32, float);
\n
"
" function float @f0(i32 %p0, float %p1) { // BlockID = 12
\n
"
" blocks 1;
\n
"
" %b0:
\n
"
" store float %p1, float* %p0, align 1;
\n
"
" ret float %p1;
\n
"
" }
\n
"
"}
\n
"
,
DumpMunger
.
getTestResults
());
IceTest
::
SubzeroBitcodeMunger
Munger
(
BitcodeRecords
,
array_lengthof
(
BitcodeRecords
),
Terminator
);
EXPECT_TRUE
(
Munger
.
runTest
(
"Good store alignment"
));
// Show what happens when changing alignment to 0.
const
uint64_t
Align0
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignZero
(),
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad store alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
"Error: (62:4) Invalid function record: <24 2 1 0>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad store alignment 0"
,
Align0
,
array_lengthof
(
Align0
)));
EXPECT_EQ
(
" store float %p1, float* %p0, align 0;
\n
"
"Error(62:4): store: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"store"
));
// Show what happens when changing alignment to 4.
const
uint64_t
Align4
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignPower
(
2
),
Terminator
,
};
EXPECT_TRUE
(
Munger
.
runTest
(
"Bad store alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
EXPECT_TRUE
(
DumpMunger
.
runTestForAssembly
(
"Good store alignment 4"
,
Align4
,
array_lengthof
(
Align4
)));
// Show what happens when changing alignment to 8.
const
uint64_t
Align8
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignPower
(
3
),
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad store alignment 8"
,
Align8
,
array_lengthof
(
Align8
)));
EXPECT_EQ
(
"Error: (62:4) Invalid function record: <24 2 1 4>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad store alignment 8"
,
Align8
,
array_lengthof
(
Align8
)));
EXPECT_EQ
(
" store float %p1, float* %p0, align 8;
\n
"
"Error(62:4): store: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"store"
));
// Show what happens when changing alignment to 2**29.
const
uint64_t
Align29
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignPower
(
29
),
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad store alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
"Error: (62:4) Invalid function record: <24 2 1 30>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad store alignment 29"
,
Align29
,
array_lengthof
(
Align29
)));
EXPECT_EQ
(
" store float %p1, float* %p0, align 536870912;
\n
"
"Error(62:4): store: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"store"
));
const
uint64_t
Align30
[]
=
{
ReplaceIndex
,
NaClBitcodeMunger
::
Replace
,
// Note: alignment stored as 0 or log2(Alignment)+1.
3
,
naclbitc
::
FUNC_CODE_INST_STORE
,
2
,
1
,
getEncAlignPower
(
30
),
Terminator
,
};
EXPECT_FALSE
(
Munger
.
runTest
(
"Bad store alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
"Error: (62:4) Invalid function record: <24 2 1 31>
\n
"
,
Munger
.
getTestResults
());
EXPECT_FALSE
(
DumpMunger
.
runTestForAssembly
(
"Bad Store alignment 30"
,
Align30
,
array_lengthof
(
Align30
)));
EXPECT_EQ
(
" store float %p1, float* %p0, align 0;
\n
"
"Error(62:4): store: Illegal alignment for float. Expects: 1 or 4
\n
"
,
DumpMunger
.
getLinesWithSubstring
(
"store"
));
}
}
// end of anonymous namespace
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment