1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/IR/ConstantsTest.cpp - Constants unit tests ----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/InstrTypes.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instruction.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm-c/Core.h"
19*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker namespace llvm {
22*9880d681SAndroid Build Coastguard Worker namespace {
23*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,Integer_i1)24*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, Integer_i1) {
25*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
26*9880d681SAndroid Build Coastguard Worker IntegerType *Int1 = IntegerType::get(Context, 1);
27*9880d681SAndroid Build Coastguard Worker Constant* One = ConstantInt::get(Int1, 1, true);
28*9880d681SAndroid Build Coastguard Worker Constant* Zero = ConstantInt::get(Int1, 0);
29*9880d681SAndroid Build Coastguard Worker Constant* NegOne = ConstantInt::get(Int1, static_cast<uint64_t>(-1), true);
30*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(NegOne, ConstantInt::getSigned(Int1, -1));
31*9880d681SAndroid Build Coastguard Worker Constant* Undef = UndefValue::get(Int1);
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker // Input: @b = constant i1 add(i1 1 , i1 1)
34*9880d681SAndroid Build Coastguard Worker // Output: @b = constant i1 false
35*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getAdd(One, One));
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker // @c = constant i1 add(i1 -1, i1 1)
38*9880d681SAndroid Build Coastguard Worker // @c = constant i1 false
39*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getAdd(NegOne, One));
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker // @d = constant i1 add(i1 -1, i1 -1)
42*9880d681SAndroid Build Coastguard Worker // @d = constant i1 false
43*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getAdd(NegOne, NegOne));
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker // @e = constant i1 sub(i1 -1, i1 1)
46*9880d681SAndroid Build Coastguard Worker // @e = constant i1 false
47*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getSub(NegOne, One));
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker // @f = constant i1 sub(i1 1 , i1 -1)
50*9880d681SAndroid Build Coastguard Worker // @f = constant i1 false
51*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getSub(One, NegOne));
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker // @g = constant i1 sub(i1 1 , i1 1)
54*9880d681SAndroid Build Coastguard Worker // @g = constant i1 false
55*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getSub(One, One));
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker // @h = constant i1 shl(i1 1 , i1 1) ; undefined
58*9880d681SAndroid Build Coastguard Worker // @h = constant i1 undef
59*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef, ConstantExpr::getShl(One, One));
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker // @i = constant i1 shl(i1 1 , i1 0)
62*9880d681SAndroid Build Coastguard Worker // @i = constant i1 true
63*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getShl(One, Zero));
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker // @j = constant i1 lshr(i1 1, i1 1) ; undefined
66*9880d681SAndroid Build Coastguard Worker // @j = constant i1 undef
67*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef, ConstantExpr::getLShr(One, One));
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker // @m = constant i1 ashr(i1 1, i1 1) ; undefined
70*9880d681SAndroid Build Coastguard Worker // @m = constant i1 undef
71*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef, ConstantExpr::getAShr(One, One));
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker // @n = constant i1 mul(i1 -1, i1 1)
74*9880d681SAndroid Build Coastguard Worker // @n = constant i1 true
75*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getMul(NegOne, One));
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker // @o = constant i1 sdiv(i1 -1, i1 1) ; overflow
78*9880d681SAndroid Build Coastguard Worker // @o = constant i1 true
79*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getSDiv(NegOne, One));
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker // @p = constant i1 sdiv(i1 1 , i1 -1); overflow
82*9880d681SAndroid Build Coastguard Worker // @p = constant i1 true
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getSDiv(One, NegOne));
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker // @q = constant i1 udiv(i1 -1, i1 1)
86*9880d681SAndroid Build Coastguard Worker // @q = constant i1 true
87*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getUDiv(NegOne, One));
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker // @r = constant i1 udiv(i1 1, i1 -1)
90*9880d681SAndroid Build Coastguard Worker // @r = constant i1 true
91*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, ConstantExpr::getUDiv(One, NegOne));
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker // @s = constant i1 srem(i1 -1, i1 1) ; overflow
94*9880d681SAndroid Build Coastguard Worker // @s = constant i1 false
95*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getSRem(NegOne, One));
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker // @t = constant i1 urem(i1 -1, i1 1)
98*9880d681SAndroid Build Coastguard Worker // @t = constant i1 false
99*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getURem(NegOne, One));
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker // @u = constant i1 srem(i1 1, i1 -1) ; overflow
102*9880d681SAndroid Build Coastguard Worker // @u = constant i1 false
103*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero, ConstantExpr::getSRem(One, NegOne));
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,IntSigns)106*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, IntSigns) {
107*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
108*9880d681SAndroid Build Coastguard Worker IntegerType *Int8Ty = Type::getInt8Ty(Context);
109*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(100, ConstantInt::get(Int8Ty, 100, false)->getSExtValue());
110*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(100, ConstantInt::get(Int8Ty, 100, true)->getSExtValue());
111*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(100, ConstantInt::getSigned(Int8Ty, 100)->getSExtValue());
112*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(-50, ConstantInt::get(Int8Ty, 206)->getSExtValue());
113*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(-50, ConstantInt::getSigned(Int8Ty, -50)->getSExtValue());
114*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(206U, ConstantInt::getSigned(Int8Ty, -50)->getZExtValue());
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker // Overflow is handled by truncation.
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0x3b, ConstantInt::get(Int8Ty, 0x13b)->getSExtValue());
118*9880d681SAndroid Build Coastguard Worker }
119*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,FP128Test)120*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, FP128Test) {
121*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
122*9880d681SAndroid Build Coastguard Worker Type *FP128Ty = Type::getFP128Ty(Context);
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker IntegerType *Int128Ty = Type::getIntNTy(Context, 128);
125*9880d681SAndroid Build Coastguard Worker Constant *Zero128 = Constant::getNullValue(Int128Ty);
126*9880d681SAndroid Build Coastguard Worker Constant *X = ConstantExpr::getUIToFP(Zero128, FP128Ty);
127*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(isa<ConstantFP>(X));
128*9880d681SAndroid Build Coastguard Worker }
129*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,PointerCast)130*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, PointerCast) {
131*9880d681SAndroid Build Coastguard Worker LLVMContext C;
132*9880d681SAndroid Build Coastguard Worker Type *Int8PtrTy = Type::getInt8PtrTy(C);
133*9880d681SAndroid Build Coastguard Worker Type *Int32PtrTy = Type::getInt32PtrTy(C);
134*9880d681SAndroid Build Coastguard Worker Type *Int64Ty = Type::getInt64Ty(C);
135*9880d681SAndroid Build Coastguard Worker VectorType *Int8PtrVecTy = VectorType::get(Int8PtrTy, 4);
136*9880d681SAndroid Build Coastguard Worker VectorType *Int32PtrVecTy = VectorType::get(Int32PtrTy, 4);
137*9880d681SAndroid Build Coastguard Worker VectorType *Int64VecTy = VectorType::get(Int64Ty, 4);
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker // ptrtoint i8* to i64
140*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Constant::getNullValue(Int64Ty),
141*9880d681SAndroid Build Coastguard Worker ConstantExpr::getPointerCast(
142*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(Int8PtrTy), Int64Ty));
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker // bitcast i8* to i32*
145*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Constant::getNullValue(Int32PtrTy),
146*9880d681SAndroid Build Coastguard Worker ConstantExpr::getPointerCast(
147*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(Int8PtrTy), Int32PtrTy));
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker // ptrtoint <4 x i8*> to <4 x i64>
150*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Constant::getNullValue(Int64VecTy),
151*9880d681SAndroid Build Coastguard Worker ConstantExpr::getPointerCast(
152*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(Int8PtrVecTy), Int64VecTy));
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker // bitcast <4 x i8*> to <4 x i32*>
155*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Constant::getNullValue(Int32PtrVecTy),
156*9880d681SAndroid Build Coastguard Worker ConstantExpr::getPointerCast(
157*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(Int8PtrVecTy), Int32PtrVecTy));
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker Type *Int32Ptr1Ty = Type::getInt32PtrTy(C, 1);
160*9880d681SAndroid Build Coastguard Worker ConstantInt *K = ConstantInt::get(Type::getInt64Ty(C), 1234);
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker // Make sure that addrspacecast of inttoptr is not folded away.
163*9880d681SAndroid Build Coastguard Worker EXPECT_NE(K,
164*9880d681SAndroid Build Coastguard Worker ConstantExpr::getAddrSpaceCast(
165*9880d681SAndroid Build Coastguard Worker ConstantExpr::getIntToPtr(K, Int32PtrTy), Int32Ptr1Ty));
166*9880d681SAndroid Build Coastguard Worker EXPECT_NE(K,
167*9880d681SAndroid Build Coastguard Worker ConstantExpr::getAddrSpaceCast(
168*9880d681SAndroid Build Coastguard Worker ConstantExpr::getIntToPtr(K, Int32Ptr1Ty), Int32PtrTy));
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker Constant *NullInt32Ptr0 = Constant::getNullValue(Int32PtrTy);
171*9880d681SAndroid Build Coastguard Worker Constant *NullInt32Ptr1 = Constant::getNullValue(Int32Ptr1Ty);
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker // Make sure that addrspacecast of null is not folded away.
174*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Constant::getNullValue(Int32PtrTy),
175*9880d681SAndroid Build Coastguard Worker ConstantExpr::getAddrSpaceCast(NullInt32Ptr0, Int32Ptr1Ty));
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Constant::getNullValue(Int32Ptr1Ty),
178*9880d681SAndroid Build Coastguard Worker ConstantExpr::getAddrSpaceCast(NullInt32Ptr1, Int32PtrTy));
179*9880d681SAndroid Build Coastguard Worker }
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker #define CHECK(x, y) { \
182*9880d681SAndroid Build Coastguard Worker std::string __s; \
183*9880d681SAndroid Build Coastguard Worker raw_string_ostream __o(__s); \
184*9880d681SAndroid Build Coastguard Worker Instruction *__I = cast<ConstantExpr>(x)->getAsInstruction(); \
185*9880d681SAndroid Build Coastguard Worker __I->print(__o); \
186*9880d681SAndroid Build Coastguard Worker delete __I; \
187*9880d681SAndroid Build Coastguard Worker __o.flush(); \
188*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(std::string(" <badref> = " y), __s); \
189*9880d681SAndroid Build Coastguard Worker }
190*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,AsInstructionsTest)191*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, AsInstructionsTest) {
192*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
193*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker Type *Int64Ty = Type::getInt64Ty(Context);
196*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(Context);
197*9880d681SAndroid Build Coastguard Worker Type *Int16Ty = Type::getInt16Ty(Context);
198*9880d681SAndroid Build Coastguard Worker Type *Int1Ty = Type::getInt1Ty(Context);
199*9880d681SAndroid Build Coastguard Worker Type *FloatTy = Type::getFloatTy(Context);
200*9880d681SAndroid Build Coastguard Worker Type *DoubleTy = Type::getDoubleTy(Context);
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker Constant *Global = M->getOrInsertGlobal("dummy",
203*9880d681SAndroid Build Coastguard Worker PointerType::getUnqual(Int32Ty));
204*9880d681SAndroid Build Coastguard Worker Constant *Global2 = M->getOrInsertGlobal("dummy2",
205*9880d681SAndroid Build Coastguard Worker PointerType::getUnqual(Int32Ty));
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker Constant *P0 = ConstantExpr::getPtrToInt(Global, Int32Ty);
208*9880d681SAndroid Build Coastguard Worker Constant *P1 = ConstantExpr::getUIToFP(P0, FloatTy);
209*9880d681SAndroid Build Coastguard Worker Constant *P2 = ConstantExpr::getUIToFP(P0, DoubleTy);
210*9880d681SAndroid Build Coastguard Worker Constant *P3 = ConstantExpr::getTrunc(P0, Int1Ty);
211*9880d681SAndroid Build Coastguard Worker Constant *P4 = ConstantExpr::getPtrToInt(Global2, Int32Ty);
212*9880d681SAndroid Build Coastguard Worker Constant *P5 = ConstantExpr::getUIToFP(P4, FloatTy);
213*9880d681SAndroid Build Coastguard Worker Constant *P6 = ConstantExpr::getBitCast(P4, VectorType::get(Int16Ty, 2));
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker Constant *One = ConstantInt::get(Int32Ty, 1);
216*9880d681SAndroid Build Coastguard Worker Constant *Two = ConstantInt::get(Int64Ty, 2);
217*9880d681SAndroid Build Coastguard Worker Constant *Big = ConstantInt::get(Context, APInt{256, uint64_t(-1), true});
218*9880d681SAndroid Build Coastguard Worker Constant *Elt = ConstantInt::get(Int16Ty, 2015);
219*9880d681SAndroid Build Coastguard Worker Constant *Undef16 = UndefValue::get(Int16Ty);
220*9880d681SAndroid Build Coastguard Worker Constant *Undef64 = UndefValue::get(Int64Ty);
221*9880d681SAndroid Build Coastguard Worker Constant *UndefV16 = UndefValue::get(P6->getType());
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker #define P0STR "ptrtoint (i32** @dummy to i32)"
224*9880d681SAndroid Build Coastguard Worker #define P1STR "uitofp (i32 ptrtoint (i32** @dummy to i32) to float)"
225*9880d681SAndroid Build Coastguard Worker #define P2STR "uitofp (i32 ptrtoint (i32** @dummy to i32) to double)"
226*9880d681SAndroid Build Coastguard Worker #define P3STR "ptrtoint (i32** @dummy to i1)"
227*9880d681SAndroid Build Coastguard Worker #define P4STR "ptrtoint (i32** @dummy2 to i32)"
228*9880d681SAndroid Build Coastguard Worker #define P5STR "uitofp (i32 ptrtoint (i32** @dummy2 to i32) to float)"
229*9880d681SAndroid Build Coastguard Worker #define P6STR "bitcast (i32 ptrtoint (i32** @dummy2 to i32) to <2 x i16>)"
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getNeg(P0), "sub i32 0, " P0STR);
232*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFNeg(P1), "fsub float -0.000000e+00, " P1STR);
233*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getNot(P0), "xor i32 " P0STR ", -1");
234*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAdd(P0, P0), "add i32 " P0STR ", " P0STR);
235*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAdd(P0, P0, false, true), "add nsw i32 " P0STR ", "
236*9880d681SAndroid Build Coastguard Worker P0STR);
237*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAdd(P0, P0, true, true), "add nuw nsw i32 " P0STR ", "
238*9880d681SAndroid Build Coastguard Worker P0STR);
239*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFAdd(P1, P1), "fadd float " P1STR ", " P1STR);
240*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getSub(P0, P0), "sub i32 " P0STR ", " P0STR);
241*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFSub(P1, P1), "fsub float " P1STR ", " P1STR);
242*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getMul(P0, P0), "mul i32 " P0STR ", " P0STR);
243*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFMul(P1, P1), "fmul float " P1STR ", " P1STR);
244*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getUDiv(P0, P0), "udiv i32 " P0STR ", " P0STR);
245*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getSDiv(P0, P0), "sdiv i32 " P0STR ", " P0STR);
246*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFDiv(P1, P1), "fdiv float " P1STR ", " P1STR);
247*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getURem(P0, P0), "urem i32 " P0STR ", " P0STR);
248*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getSRem(P0, P0), "srem i32 " P0STR ", " P0STR);
249*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFRem(P1, P1), "frem float " P1STR ", " P1STR);
250*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAnd(P0, P0), "and i32 " P0STR ", " P0STR);
251*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getOr(P0, P0), "or i32 " P0STR ", " P0STR);
252*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getXor(P0, P0), "xor i32 " P0STR ", " P0STR);
253*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getShl(P0, P0), "shl i32 " P0STR ", " P0STR);
254*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getShl(P0, P0, true), "shl nuw i32 " P0STR ", " P0STR);
255*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getShl(P0, P0, false, true), "shl nsw i32 " P0STR ", "
256*9880d681SAndroid Build Coastguard Worker P0STR);
257*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getLShr(P0, P0, false), "lshr i32 " P0STR ", " P0STR);
258*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getLShr(P0, P0, true), "lshr exact i32 " P0STR ", " P0STR);
259*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAShr(P0, P0, false), "ashr i32 " P0STR ", " P0STR);
260*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getAShr(P0, P0, true), "ashr exact i32 " P0STR ", " P0STR);
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getSExt(P0, Int64Ty), "sext i32 " P0STR " to i64");
263*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getZExt(P0, Int64Ty), "zext i32 " P0STR " to i64");
264*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFPTrunc(P2, FloatTy), "fptrunc double " P2STR
265*9880d681SAndroid Build Coastguard Worker " to float");
266*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFPExtend(P1, DoubleTy), "fpext float " P1STR
267*9880d681SAndroid Build Coastguard Worker " to double");
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getExactUDiv(P0, P0), "udiv exact i32 " P0STR ", " P0STR);
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getSelect(P3, P0, P4), "select i1 " P3STR ", i32 " P0STR
272*9880d681SAndroid Build Coastguard Worker ", i32 " P4STR);
273*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getICmp(CmpInst::ICMP_EQ, P0, P4), "icmp eq i32 " P0STR
274*9880d681SAndroid Build Coastguard Worker ", " P4STR);
275*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getFCmp(CmpInst::FCMP_ULT, P1, P5), "fcmp ult float "
276*9880d681SAndroid Build Coastguard Worker P1STR ", " P5STR);
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker std::vector<Constant*> V;
279*9880d681SAndroid Build Coastguard Worker V.push_back(One);
280*9880d681SAndroid Build Coastguard Worker // FIXME: getGetElementPtr() actually creates an inbounds ConstantGEP,
281*9880d681SAndroid Build Coastguard Worker // not a normal one!
282*9880d681SAndroid Build Coastguard Worker //CHECK(ConstantExpr::getGetElementPtr(Global, V, false),
283*9880d681SAndroid Build Coastguard Worker // "getelementptr i32*, i32** @dummy, i32 1");
284*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getInBoundsGetElementPtr(PointerType::getUnqual(Int32Ty),
285*9880d681SAndroid Build Coastguard Worker Global, V),
286*9880d681SAndroid Build Coastguard Worker "getelementptr inbounds i32*, i32** @dummy, i32 1");
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker CHECK(ConstantExpr::getExtractElement(P6, One), "extractelement <2 x i16> "
289*9880d681SAndroid Build Coastguard Worker P6STR ", i32 1");
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef16, ConstantExpr::getExtractElement(P6, Two));
292*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef16, ConstantExpr::getExtractElement(P6, Big));
293*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Undef16, ConstantExpr::getExtractElement(P6, Undef64));
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Elt, ConstantExpr::getExtractElement(
296*9880d681SAndroid Build Coastguard Worker ConstantExpr::getInsertElement(P6, Elt, One), One));
297*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(UndefV16, ConstantExpr::getInsertElement(P6, Elt, Two));
298*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(UndefV16, ConstantExpr::getInsertElement(P6, Elt, Big));
299*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(UndefV16, ConstantExpr::getInsertElement(P6, Elt, Undef64));
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker #ifdef GTEST_HAS_DEATH_TEST
303*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
TEST(ConstantsTest,ReplaceWithConstantTest)304*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, ReplaceWithConstantTest) {
305*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
306*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(Context);
309*9880d681SAndroid Build Coastguard Worker Constant *One = ConstantInt::get(Int32Ty, 1);
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker Constant *Global =
312*9880d681SAndroid Build Coastguard Worker M->getOrInsertGlobal("dummy", PointerType::getUnqual(Int32Ty));
313*9880d681SAndroid Build Coastguard Worker Constant *GEP = ConstantExpr::getGetElementPtr(
314*9880d681SAndroid Build Coastguard Worker PointerType::getUnqual(Int32Ty), Global, One);
315*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(Global->replaceAllUsesWith(GEP),
316*9880d681SAndroid Build Coastguard Worker "this->replaceAllUsesWith\\(expr\\(this\\)\\) is NOT valid!");
317*9880d681SAndroid Build Coastguard Worker }
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker #endif
320*9880d681SAndroid Build Coastguard Worker #endif
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker #undef CHECK
323*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,ConstantArrayReplaceWithConstant)324*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, ConstantArrayReplaceWithConstant) {
325*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
326*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker Type *IntTy = Type::getInt8Ty(Context);
329*9880d681SAndroid Build Coastguard Worker ArrayType *ArrayTy = ArrayType::get(IntTy, 2);
330*9880d681SAndroid Build Coastguard Worker Constant *A01Vals[2] = {ConstantInt::get(IntTy, 0),
331*9880d681SAndroid Build Coastguard Worker ConstantInt::get(IntTy, 1)};
332*9880d681SAndroid Build Coastguard Worker Constant *A01 = ConstantArray::get(ArrayTy, A01Vals);
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker Constant *Global = new GlobalVariable(*M, IntTy, false,
335*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage, nullptr);
336*9880d681SAndroid Build Coastguard Worker Constant *GlobalInt = ConstantExpr::getPtrToInt(Global, IntTy);
337*9880d681SAndroid Build Coastguard Worker Constant *A0GVals[2] = {ConstantInt::get(IntTy, 0), GlobalInt};
338*9880d681SAndroid Build Coastguard Worker Constant *A0G = ConstantArray::get(ArrayTy, A0GVals);
339*9880d681SAndroid Build Coastguard Worker ASSERT_NE(A01, A0G);
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker GlobalVariable *RefArray =
342*9880d681SAndroid Build Coastguard Worker new GlobalVariable(*M, ArrayTy, false, GlobalValue::ExternalLinkage, A0G);
343*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(A0G, RefArray->getInitializer());
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker GlobalInt->replaceAllUsesWith(ConstantInt::get(IntTy, 1));
346*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(A01, RefArray->getInitializer());
347*9880d681SAndroid Build Coastguard Worker }
348*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,ConstantExprReplaceWithConstant)349*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, ConstantExprReplaceWithConstant) {
350*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
351*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker Type *IntTy = Type::getInt8Ty(Context);
354*9880d681SAndroid Build Coastguard Worker Constant *G1 = new GlobalVariable(*M, IntTy, false,
355*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage, nullptr);
356*9880d681SAndroid Build Coastguard Worker Constant *G2 = new GlobalVariable(*M, IntTy, false,
357*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage, nullptr);
358*9880d681SAndroid Build Coastguard Worker ASSERT_NE(G1, G2);
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker Constant *Int1 = ConstantExpr::getPtrToInt(G1, IntTy);
361*9880d681SAndroid Build Coastguard Worker Constant *Int2 = ConstantExpr::getPtrToInt(G2, IntTy);
362*9880d681SAndroid Build Coastguard Worker ASSERT_NE(Int1, Int2);
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker GlobalVariable *Ref =
365*9880d681SAndroid Build Coastguard Worker new GlobalVariable(*M, IntTy, false, GlobalValue::ExternalLinkage, Int1);
366*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(Int1, Ref->getInitializer());
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker G1->replaceAllUsesWith(G2);
369*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(Int2, Ref->getInitializer());
370*9880d681SAndroid Build Coastguard Worker }
371*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,GEPReplaceWithConstant)372*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, GEPReplaceWithConstant) {
373*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
374*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Worker Type *IntTy = Type::getInt32Ty(Context);
377*9880d681SAndroid Build Coastguard Worker Type *PtrTy = PointerType::get(IntTy, 0);
378*9880d681SAndroid Build Coastguard Worker auto *C1 = ConstantInt::get(IntTy, 1);
379*9880d681SAndroid Build Coastguard Worker auto *Placeholder = new GlobalVariable(
380*9880d681SAndroid Build Coastguard Worker *M, IntTy, false, GlobalValue::ExternalWeakLinkage, nullptr);
381*9880d681SAndroid Build Coastguard Worker auto *GEP = ConstantExpr::getGetElementPtr(IntTy, Placeholder, C1);
382*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(GEP->getOperand(0), Placeholder);
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker auto *Ref =
385*9880d681SAndroid Build Coastguard Worker new GlobalVariable(*M, PtrTy, false, GlobalValue::ExternalLinkage, GEP);
386*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(GEP, Ref->getInitializer());
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker auto *Global = new GlobalVariable(*M, PtrTy, false,
389*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage, nullptr);
390*9880d681SAndroid Build Coastguard Worker auto *Alias = GlobalAlias::create(IntTy, 0, GlobalValue::ExternalLinkage,
391*9880d681SAndroid Build Coastguard Worker "alias", Global, M.get());
392*9880d681SAndroid Build Coastguard Worker Placeholder->replaceAllUsesWith(Alias);
393*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(GEP, Ref->getInitializer());
394*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(GEP->getOperand(0), Alias);
395*9880d681SAndroid Build Coastguard Worker }
396*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,AliasCAPI)397*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, AliasCAPI) {
398*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
399*9880d681SAndroid Build Coastguard Worker SMDiagnostic Error;
400*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M =
401*9880d681SAndroid Build Coastguard Worker parseAssemblyString("@g = global i32 42", Error, Context);
402*9880d681SAndroid Build Coastguard Worker GlobalVariable *G = M->getGlobalVariable("g");
403*9880d681SAndroid Build Coastguard Worker Type *I16Ty = Type::getInt16Ty(Context);
404*9880d681SAndroid Build Coastguard Worker Type *I16PTy = PointerType::get(I16Ty, 0);
405*9880d681SAndroid Build Coastguard Worker Constant *Aliasee = ConstantExpr::getBitCast(G, I16PTy);
406*9880d681SAndroid Build Coastguard Worker LLVMValueRef AliasRef =
407*9880d681SAndroid Build Coastguard Worker LLVMAddAlias(wrap(M.get()), wrap(I16PTy), wrap(Aliasee), "a");
408*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(unwrap<GlobalAlias>(AliasRef)->getAliasee(), Aliasee);
409*9880d681SAndroid Build Coastguard Worker }
410*9880d681SAndroid Build Coastguard Worker
getNameOfType(Type * T)411*9880d681SAndroid Build Coastguard Worker static std::string getNameOfType(Type *T) {
412*9880d681SAndroid Build Coastguard Worker std::string S;
413*9880d681SAndroid Build Coastguard Worker raw_string_ostream RSOS(S);
414*9880d681SAndroid Build Coastguard Worker T->print(RSOS);
415*9880d681SAndroid Build Coastguard Worker return S;
416*9880d681SAndroid Build Coastguard Worker }
417*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,BuildConstantDataArrays)418*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, BuildConstantDataArrays) {
419*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
420*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker for (Type *T : {Type::getInt8Ty(Context), Type::getInt16Ty(Context),
423*9880d681SAndroid Build Coastguard Worker Type::getInt32Ty(Context), Type::getInt64Ty(Context)}) {
424*9880d681SAndroid Build Coastguard Worker ArrayType *ArrayTy = ArrayType::get(T, 2);
425*9880d681SAndroid Build Coastguard Worker Constant *Vals[] = {ConstantInt::get(T, 0), ConstantInt::get(T, 1)};
426*9880d681SAndroid Build Coastguard Worker Constant *CDV = ConstantArray::get(ArrayTy, Vals);
427*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(dyn_cast<ConstantDataArray>(CDV) != nullptr)
428*9880d681SAndroid Build Coastguard Worker << " T = " << getNameOfType(T);
429*9880d681SAndroid Build Coastguard Worker }
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker for (Type *T : {Type::getHalfTy(Context), Type::getFloatTy(Context),
432*9880d681SAndroid Build Coastguard Worker Type::getDoubleTy(Context)}) {
433*9880d681SAndroid Build Coastguard Worker ArrayType *ArrayTy = ArrayType::get(T, 2);
434*9880d681SAndroid Build Coastguard Worker Constant *Vals[] = {ConstantFP::get(T, 0), ConstantFP::get(T, 1)};
435*9880d681SAndroid Build Coastguard Worker Constant *CDV = ConstantArray::get(ArrayTy, Vals);
436*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(dyn_cast<ConstantDataArray>(CDV) != nullptr)
437*9880d681SAndroid Build Coastguard Worker << " T = " << getNameOfType(T);
438*9880d681SAndroid Build Coastguard Worker }
439*9880d681SAndroid Build Coastguard Worker }
440*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,BuildConstantDataVectors)441*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, BuildConstantDataVectors) {
442*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
443*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker for (Type *T : {Type::getInt8Ty(Context), Type::getInt16Ty(Context),
446*9880d681SAndroid Build Coastguard Worker Type::getInt32Ty(Context), Type::getInt64Ty(Context)}) {
447*9880d681SAndroid Build Coastguard Worker Constant *Vals[] = {ConstantInt::get(T, 0), ConstantInt::get(T, 1)};
448*9880d681SAndroid Build Coastguard Worker Constant *CDV = ConstantVector::get(Vals);
449*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(dyn_cast<ConstantDataVector>(CDV) != nullptr)
450*9880d681SAndroid Build Coastguard Worker << " T = " << getNameOfType(T);
451*9880d681SAndroid Build Coastguard Worker }
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker for (Type *T : {Type::getHalfTy(Context), Type::getFloatTy(Context),
454*9880d681SAndroid Build Coastguard Worker Type::getDoubleTy(Context)}) {
455*9880d681SAndroid Build Coastguard Worker Constant *Vals[] = {ConstantFP::get(T, 0), ConstantFP::get(T, 1)};
456*9880d681SAndroid Build Coastguard Worker Constant *CDV = ConstantVector::get(Vals);
457*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(dyn_cast<ConstantDataVector>(CDV) != nullptr)
458*9880d681SAndroid Build Coastguard Worker << " T = " << getNameOfType(T);
459*9880d681SAndroid Build Coastguard Worker }
460*9880d681SAndroid Build Coastguard Worker }
461*9880d681SAndroid Build Coastguard Worker
TEST(ConstantsTest,BitcastToGEP)462*9880d681SAndroid Build Coastguard Worker TEST(ConstantsTest, BitcastToGEP) {
463*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
464*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("MyModule", Context));
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker auto *i32 = Type::getInt32Ty(Context);
467*9880d681SAndroid Build Coastguard Worker auto *U = StructType::create(Context, "Unsized");
468*9880d681SAndroid Build Coastguard Worker Type *EltTys[] = {i32, U};
469*9880d681SAndroid Build Coastguard Worker auto *S = StructType::create(EltTys);
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Worker auto *G = new GlobalVariable(*M, S, false,
472*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage, nullptr);
473*9880d681SAndroid Build Coastguard Worker auto *PtrTy = PointerType::get(i32, 0);
474*9880d681SAndroid Build Coastguard Worker auto *C = ConstantExpr::getBitCast(G, PtrTy);
475*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(dyn_cast<ConstantExpr>(C)->getOpcode(),
476*9880d681SAndroid Build Coastguard Worker Instruction::BitCast);
477*9880d681SAndroid Build Coastguard Worker }
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
480*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
481