1 : // Copyright 2015 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : #include "syzygy/pe/cvinfo_ext.h"
16 :
17 : #include "gtest/gtest.h"
18 :
19 : namespace pe {
20 :
21 : namespace cci = Microsoft_Cci_Pdb;
22 :
23 : // This macro checks that an unsigned bit field in a flag-converting union
24 : // matches a mask. This is to validate that the physical layout of the union
25 : // bitfields matches the masks that originally define these.
26 : // @param fld the name of a field in an existing union named "inst".
27 : // @param bit_size the bit size of @p fld.
28 : // @param mask the mask to test the "raw" member of "inst" against.
29 : #define TEST_BITFIELD(fld, bit_size, mask) \
30 : inst.raw = 0; \
31 : ASSERT_EQ(0, inst.fld); \
32 : --inst.fld; \
33 : ASSERT_EQ((1 << bit_size) - 1, inst.fld); \
34 : ASSERT_EQ(0, inst.raw & ~mask)
35 :
36 E : TEST(CVInfoExtTest, LeafMemberAttributeFieldTest) {
37 E : LeafMemberAttributeField inst = {};
38 :
39 E : TEST_BITFIELD(access, 2, cci::access);
40 E : TEST_BITFIELD(mprop, 3, cci::mprop);
41 E : TEST_BITFIELD(pseudo, 1, cci::pseudo);
42 E : TEST_BITFIELD(noinherit, 1, cci::noinherit);
43 E : TEST_BITFIELD(noconstruct, 1, cci::noconstruct);
44 E : TEST_BITFIELD(compgenx, 1, cci::compgenx);
45 E : }
46 :
47 E : TEST(CVInfoExtTest, LeafPropertyFieldTest) {
48 E : LeafPropertyField inst = {};
49 :
50 E : TEST_BITFIELD(packed, 1, cci::packed);
51 E : TEST_BITFIELD(ctor, 1, cci::ctor);
52 E : TEST_BITFIELD(ovlops, 1, cci::ovlops);
53 E : TEST_BITFIELD(isnested, 1, cci::isnested);
54 E : TEST_BITFIELD(cnested, 1, cci::cnested);
55 E : TEST_BITFIELD(opassign, 1, cci::opassign);
56 E : TEST_BITFIELD(opcast, 1, cci::opcast);
57 E : TEST_BITFIELD(fwdref, 1, cci::fwdref);
58 E : TEST_BITFIELD(scoped, 1, cci::scoped);
59 E : TEST_BITFIELD(decorated_name_present, 1, 0x0200);
60 E : }
61 :
62 E : TEST(CVInfoExtTest, LeafPointerAttributeTest) {
63 E : LeafPointerAttribute inst = {};
64 :
65 E : TEST_BITFIELD(ptrtype, 5, cci::ptrtype);
66 E : TEST_BITFIELD(ptrmode, 3, cci::ptrmode);
67 E : TEST_BITFIELD(isflat32, 1, cci::isflat32);
68 E : TEST_BITFIELD(isvolatile, 1, cci::isvolatile);
69 E : TEST_BITFIELD(isconst, 1, cci::isconst);
70 E : TEST_BITFIELD(isunaligned, 1, cci::isunaligned);
71 E : TEST_BITFIELD(isrestrict, 1, cci::isrestrict);
72 E : }
73 :
74 E : TEST(CVInfoExtTest, LeafModifierAttributeTest) {
75 E : LeafModifierAttribute inst = {};
76 :
77 E : TEST_BITFIELD(mod_const, 1, cci::MOD_const);
78 E : TEST_BITFIELD(mod_volatile, 1, cci::MOD_volatile);
79 E : TEST_BITFIELD(mod_unaligned, 1, cci::MOD_unaligned);
80 E : }
81 :
82 E : TEST(CVInfoExtTest, CompileSymFlagsTest) {
83 E : CompileSymFlags inst = {};
84 :
85 E : TEST_BITFIELD(iLanguage, 8, cci::iLanguage);
86 E : TEST_BITFIELD(fEC, 1, cci::fEC);
87 E : TEST_BITFIELD(fNoDbgInfo, 1, cci::fNoDbgInfo);
88 E : TEST_BITFIELD(fLTCG, 1, cci::fLTCG);
89 E : TEST_BITFIELD(fNoDataAlign, 1, cci::fNoDataAlign);
90 E : TEST_BITFIELD(fManagedPresent, 1, cci::fManagedPresent);
91 E : TEST_BITFIELD(fSecurityChecks, 1, cci::fSecurityChecks);
92 E : TEST_BITFIELD(fHotPatch, 1, cci::fHotPatch);
93 E : TEST_BITFIELD(fCVTCIL, 1, cci::fCVTCIL);
94 E : TEST_BITFIELD(fMSILModule, 1, cci::fMSILModule);
95 E : }
96 :
97 E : TEST(CVInfoExtTest, LocalVarFlagsTest) {
98 E : LocalVarFlags inst = {};
99 :
100 E : TEST_BITFIELD(fIsParam, 1, cci::fIsParam);
101 E : TEST_BITFIELD(fAddrTaken, 1, cci::fAddrTaken);
102 E : TEST_BITFIELD(fCompGenx, 1, cci::fCompGenx);
103 E : TEST_BITFIELD(fIsAggregate, 1, cci::fIsAggregate);
104 E : TEST_BITFIELD(fIsAggregated, 1, cci::fIsAggregated);
105 E : TEST_BITFIELD(fIsAliased, 1, cci::fIsAliased);
106 E : TEST_BITFIELD(fIsAlias, 1, cci::fIsAlias);
107 E : }
108 :
109 E : TEST(CVInfoExtTest, ExportVarFlagsTest) {
110 E : ExportVarFlags inst = {};
111 :
112 E : TEST_BITFIELD(fConstant, 1, cci::fConstant);
113 E : TEST_BITFIELD(fData, 1, cci::fData);
114 E : TEST_BITFIELD(fPrivate, 1, cci::fPrivate);
115 E : TEST_BITFIELD(fNoName, 1, cci::fNoName);
116 E : TEST_BITFIELD(fOrdinal, 1, cci::fOrdinal);
117 E : TEST_BITFIELD(fForwarder, 1, cci::fForwarder);
118 E : }
119 :
120 E : TEST(CVInfoExtTest, FrameProcSymFlagsTest) {
121 E : FrameProcSymFlags inst = {};
122 :
123 E : TEST_BITFIELD(fHasAlloca, 1, cci::fHasAlloca);
124 E : TEST_BITFIELD(fHasSetJmp, 1, cci::fHasSetJmp);
125 E : TEST_BITFIELD(fHasLongJmp, 1, cci::fHasLongJmp);
126 E : TEST_BITFIELD(fHasInlAsm, 1, cci::fHasInlAsm);
127 E : TEST_BITFIELD(fHasEH, 1, cci::fHasEH);
128 E : TEST_BITFIELD(fInlSpec, 1, cci::fInlSpec);
129 E : TEST_BITFIELD(fHasSEH, 1, cci::fHasSEH);
130 E : TEST_BITFIELD(fNaked, 1, cci::fNaked);
131 E : TEST_BITFIELD(fSecurityChecks, 1, 0x100); // No symbolic constant.
132 E : TEST_BITFIELD(fAsyncEH, 1, cci::fAsyncEH);
133 E : TEST_BITFIELD(fGSNoStackOrdering, 1, cci::fGSNoStackOrdering);
134 E : TEST_BITFIELD(fWasInlined, 1, cci::fWasInlined);
135 E : }
136 :
137 : } // namespace pe
|