xref: /aosp_15_r20/external/llvm/unittests/Bitcode/BitReaderTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/Bitcode/BitReaderTest.cpp - Tests for BitReader ------===//
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/ADT/SmallString.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/BitstreamReader.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/BitstreamWriter.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/ReaderWriter.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Verifier.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataStream.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/StreamingMemoryObject.h"
26*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker using namespace llvm;
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker namespace {
31*9880d681SAndroid Build Coastguard Worker 
parseAssembly(LLVMContext & Context,const char * Assembly)32*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> parseAssembly(LLVMContext &Context,
33*9880d681SAndroid Build Coastguard Worker                                       const char *Assembly) {
34*9880d681SAndroid Build Coastguard Worker   SMDiagnostic Error;
35*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = parseAssemblyString(Assembly, Error, Context);
36*9880d681SAndroid Build Coastguard Worker 
37*9880d681SAndroid Build Coastguard Worker   std::string ErrMsg;
38*9880d681SAndroid Build Coastguard Worker   raw_string_ostream OS(ErrMsg);
39*9880d681SAndroid Build Coastguard Worker   Error.print("", OS);
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker   // A failure here means that the test itself is buggy.
42*9880d681SAndroid Build Coastguard Worker   if (!M)
43*9880d681SAndroid Build Coastguard Worker     report_fatal_error(OS.str().c_str());
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker   return M;
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker 
writeModuleToBuffer(std::unique_ptr<Module> Mod,SmallVectorImpl<char> & Buffer)48*9880d681SAndroid Build Coastguard Worker static void writeModuleToBuffer(std::unique_ptr<Module> Mod,
49*9880d681SAndroid Build Coastguard Worker                                 SmallVectorImpl<char> &Buffer) {
50*9880d681SAndroid Build Coastguard Worker   raw_svector_ostream OS(Buffer);
51*9880d681SAndroid Build Coastguard Worker   WriteBitcodeToFile(Mod.get(), OS);
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker 
getLazyModuleFromAssembly(LLVMContext & Context,SmallString<1024> & Mem,const char * Assembly)54*9880d681SAndroid Build Coastguard Worker static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context,
55*9880d681SAndroid Build Coastguard Worker                                                          SmallString<1024> &Mem,
56*9880d681SAndroid Build Coastguard Worker                                                          const char *Assembly) {
57*9880d681SAndroid Build Coastguard Worker   writeModuleToBuffer(parseAssembly(Context, Assembly), Mem);
58*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buffer =
59*9880d681SAndroid Build Coastguard Worker       MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
60*9880d681SAndroid Build Coastguard Worker   ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
61*9880d681SAndroid Build Coastguard Worker       getLazyBitcodeModule(std::move(Buffer), Context);
62*9880d681SAndroid Build Coastguard Worker   return std::move(ModuleOrErr.get());
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker class BufferDataStreamer : public DataStreamer {
66*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buffer;
67*9880d681SAndroid Build Coastguard Worker   unsigned Pos = 0;
GetBytes(unsigned char * Out,size_t Len)68*9880d681SAndroid Build Coastguard Worker   size_t GetBytes(unsigned char *Out, size_t Len) override {
69*9880d681SAndroid Build Coastguard Worker     StringRef Buf = Buffer->getBuffer();
70*9880d681SAndroid Build Coastguard Worker     size_t Left = Buf.size() - Pos;
71*9880d681SAndroid Build Coastguard Worker     Len = std::min(Left, Len);
72*9880d681SAndroid Build Coastguard Worker     memcpy(Out, Buffer->getBuffer().substr(Pos).data(), Len);
73*9880d681SAndroid Build Coastguard Worker     Pos += Len;
74*9880d681SAndroid Build Coastguard Worker     return Len;
75*9880d681SAndroid Build Coastguard Worker   }
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker public:
BufferDataStreamer(std::unique_ptr<MemoryBuffer> Buffer)78*9880d681SAndroid Build Coastguard Worker   BufferDataStreamer(std::unique_ptr<MemoryBuffer> Buffer)
79*9880d681SAndroid Build Coastguard Worker       : Buffer(std::move(Buffer)) {}
80*9880d681SAndroid Build Coastguard Worker };
81*9880d681SAndroid Build Coastguard Worker 
82*9880d681SAndroid Build Coastguard Worker static std::unique_ptr<Module>
getStreamedModuleFromAssembly(LLVMContext & Context,SmallString<1024> & Mem,const char * Assembly)83*9880d681SAndroid Build Coastguard Worker getStreamedModuleFromAssembly(LLVMContext &Context, SmallString<1024> &Mem,
84*9880d681SAndroid Build Coastguard Worker                               const char *Assembly) {
85*9880d681SAndroid Build Coastguard Worker   writeModuleToBuffer(parseAssembly(Context, Assembly), Mem);
86*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buffer =
87*9880d681SAndroid Build Coastguard Worker       MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
88*9880d681SAndroid Build Coastguard Worker   auto Streamer = llvm::make_unique<BufferDataStreamer>(std::move(Buffer));
89*9880d681SAndroid Build Coastguard Worker   ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
90*9880d681SAndroid Build Coastguard Worker       getStreamedBitcodeModule("test", std::move(Streamer), Context);
91*9880d681SAndroid Build Coastguard Worker   return std::move(ModuleOrErr.get());
92*9880d681SAndroid Build Coastguard Worker }
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker // Checks if we correctly detect eof if we try to read N bits when there are not
95*9880d681SAndroid Build Coastguard Worker // enough bits left on the input stream to read N bits, and we are using a data
96*9880d681SAndroid Build Coastguard Worker // streamer. In particular, it checks if we properly set the object size when
97*9880d681SAndroid Build Coastguard Worker // the eof is reached under such conditions.
TEST(BitReaderTest,TestForEofAfterReadFailureOnDataStreamer)98*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, TestForEofAfterReadFailureOnDataStreamer) {
99*9880d681SAndroid Build Coastguard Worker   // Note: Because StreamingMemoryObject does a call to method GetBytes in it's
100*9880d681SAndroid Build Coastguard Worker   // constructor, using internal constant kChunkSize, we must fill the input
101*9880d681SAndroid Build Coastguard Worker   // with more characters than that amount.
102*9880d681SAndroid Build Coastguard Worker   static size_t InputSize = StreamingMemoryObject::kChunkSize + 5;
103*9880d681SAndroid Build Coastguard Worker   char *Text = new char[InputSize];
104*9880d681SAndroid Build Coastguard Worker   std::memset(Text, 'a', InputSize);
105*9880d681SAndroid Build Coastguard Worker   Text[InputSize - 1] = '\0';
106*9880d681SAndroid Build Coastguard Worker   StringRef Input(Text);
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker   // Build bitsteam reader using data streamer.
109*9880d681SAndroid Build Coastguard Worker   auto MemoryBuf = MemoryBuffer::getMemBuffer(Input);
110*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<DataStreamer> Streamer(
111*9880d681SAndroid Build Coastguard Worker       new BufferDataStreamer(std::move(MemoryBuf)));
112*9880d681SAndroid Build Coastguard Worker   auto OwnedBytes =
113*9880d681SAndroid Build Coastguard Worker       llvm::make_unique<StreamingMemoryObject>(std::move(Streamer));
114*9880d681SAndroid Build Coastguard Worker   auto Reader = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes));
115*9880d681SAndroid Build Coastguard Worker   BitstreamCursor Cursor;
116*9880d681SAndroid Build Coastguard Worker   Cursor.init(Reader.get());
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker   // Jump to two bytes before end of stream.
119*9880d681SAndroid Build Coastguard Worker   Cursor.JumpToBit((InputSize - 4) * CHAR_BIT);
120*9880d681SAndroid Build Coastguard Worker   // Try to read 4 bytes when only 2 are present, resulting in error value 0.
121*9880d681SAndroid Build Coastguard Worker   const size_t ReadErrorValue = 0;
122*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ReadErrorValue, Cursor.Read(32));
123*9880d681SAndroid Build Coastguard Worker   // Should be at eof now.
124*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Cursor.AtEndOfStream());
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker   delete[] Text;
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker 
TEST(BitReaderTest,MateralizeForwardRefWithStream)129*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, MateralizeForwardRefWithStream) {
130*9880d681SAndroid Build Coastguard Worker   SmallString<1024> Mem;
131*9880d681SAndroid Build Coastguard Worker 
132*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
133*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = getStreamedModuleFromAssembly(
134*9880d681SAndroid Build Coastguard Worker       Context, Mem, "@table = constant i8* blockaddress(@func, %bb)\n"
135*9880d681SAndroid Build Coastguard Worker                     "define void @func() {\n"
136*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
137*9880d681SAndroid Build Coastguard Worker                     "bb:\n"
138*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
139*9880d681SAndroid Build Coastguard Worker                     "}\n");
140*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getFunction("func")->empty());
141*9880d681SAndroid Build Coastguard Worker }
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker // Tests that lazy evaluation can parse functions out of order.
TEST(BitReaderTest,MaterializeFunctionsOutOfOrder)144*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) {
145*9880d681SAndroid Build Coastguard Worker   SmallString<1024> Mem;
146*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
147*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = getLazyModuleFromAssembly(
148*9880d681SAndroid Build Coastguard Worker       Context, Mem, "define void @f() {\n"
149*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
150*9880d681SAndroid Build Coastguard Worker                     "}\n"
151*9880d681SAndroid Build Coastguard Worker                     "define void @g() {\n"
152*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
153*9880d681SAndroid Build Coastguard Worker                     "}\n"
154*9880d681SAndroid Build Coastguard Worker                     "define void @h() {\n"
155*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
156*9880d681SAndroid Build Coastguard Worker                     "}\n"
157*9880d681SAndroid Build Coastguard Worker                     "define void @j() {\n"
158*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
159*9880d681SAndroid Build Coastguard Worker                     "}\n");
160*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker   Function *F = M->getFunction("f");
163*9880d681SAndroid Build Coastguard Worker   Function *G = M->getFunction("g");
164*9880d681SAndroid Build Coastguard Worker   Function *H = M->getFunction("h");
165*9880d681SAndroid Build Coastguard Worker   Function *J = M->getFunction("j");
166*9880d681SAndroid Build Coastguard Worker 
167*9880d681SAndroid Build Coastguard Worker   // Initially all functions are not materialized (no basic blocks).
168*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->empty());
169*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(G->empty());
170*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(H->empty());
171*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(J->empty());
172*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker   // Materialize h.
175*9880d681SAndroid Build Coastguard Worker   H->materialize();
176*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->empty());
177*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(G->empty());
178*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(H->empty());
179*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(J->empty());
180*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
181*9880d681SAndroid Build Coastguard Worker 
182*9880d681SAndroid Build Coastguard Worker   // Materialize g.
183*9880d681SAndroid Build Coastguard Worker   G->materialize();
184*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->empty());
185*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(G->empty());
186*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(H->empty());
187*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(J->empty());
188*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
189*9880d681SAndroid Build Coastguard Worker 
190*9880d681SAndroid Build Coastguard Worker   // Materialize j.
191*9880d681SAndroid Build Coastguard Worker   J->materialize();
192*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->empty());
193*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(G->empty());
194*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(H->empty());
195*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(J->empty());
196*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker   // Materialize f.
199*9880d681SAndroid Build Coastguard Worker   F->materialize();
200*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->empty());
201*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(G->empty());
202*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(H->empty());
203*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(J->empty());
204*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker 
TEST(BitReaderTest,MaterializeFunctionsForBlockAddr)207*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
208*9880d681SAndroid Build Coastguard Worker   SmallString<1024> Mem;
209*9880d681SAndroid Build Coastguard Worker 
210*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
211*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = getLazyModuleFromAssembly(
212*9880d681SAndroid Build Coastguard Worker       Context, Mem, "@table = constant i8* blockaddress(@func, %bb)\n"
213*9880d681SAndroid Build Coastguard Worker                     "define void @func() {\n"
214*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
215*9880d681SAndroid Build Coastguard Worker                     "bb:\n"
216*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
217*9880d681SAndroid Build Coastguard Worker                     "}\n");
218*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
219*9880d681SAndroid Build Coastguard Worker }
220*9880d681SAndroid Build Coastguard Worker 
TEST(BitReaderTest,MaterializeFunctionsForBlockAddrInFunctionBefore)221*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, MaterializeFunctionsForBlockAddrInFunctionBefore) {
222*9880d681SAndroid Build Coastguard Worker   SmallString<1024> Mem;
223*9880d681SAndroid Build Coastguard Worker 
224*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
225*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = getLazyModuleFromAssembly(
226*9880d681SAndroid Build Coastguard Worker       Context, Mem, "define i8* @before() {\n"
227*9880d681SAndroid Build Coastguard Worker                     "  ret i8* blockaddress(@func, %bb)\n"
228*9880d681SAndroid Build Coastguard Worker                     "}\n"
229*9880d681SAndroid Build Coastguard Worker                     "define void @other() {\n"
230*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
231*9880d681SAndroid Build Coastguard Worker                     "}\n"
232*9880d681SAndroid Build Coastguard Worker                     "define void @func() {\n"
233*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
234*9880d681SAndroid Build Coastguard Worker                     "bb:\n"
235*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
236*9880d681SAndroid Build Coastguard Worker                     "}\n");
237*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("before")->empty());
238*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("func")->empty());
239*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
240*9880d681SAndroid Build Coastguard Worker 
241*9880d681SAndroid Build Coastguard Worker   // Materialize @before, pulling in @func.
242*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getFunction("before")->materialize());
243*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getFunction("func")->empty());
244*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("other")->empty());
245*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
246*9880d681SAndroid Build Coastguard Worker }
247*9880d681SAndroid Build Coastguard Worker 
TEST(BitReaderTest,MaterializeFunctionsForBlockAddrInFunctionAfter)248*9880d681SAndroid Build Coastguard Worker TEST(BitReaderTest, MaterializeFunctionsForBlockAddrInFunctionAfter) {
249*9880d681SAndroid Build Coastguard Worker   SmallString<1024> Mem;
250*9880d681SAndroid Build Coastguard Worker 
251*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
252*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = getLazyModuleFromAssembly(
253*9880d681SAndroid Build Coastguard Worker       Context, Mem, "define void @func() {\n"
254*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
255*9880d681SAndroid Build Coastguard Worker                     "bb:\n"
256*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
257*9880d681SAndroid Build Coastguard Worker                     "}\n"
258*9880d681SAndroid Build Coastguard Worker                     "define void @other() {\n"
259*9880d681SAndroid Build Coastguard Worker                     "  unreachable\n"
260*9880d681SAndroid Build Coastguard Worker                     "}\n"
261*9880d681SAndroid Build Coastguard Worker                     "define i8* @after() {\n"
262*9880d681SAndroid Build Coastguard Worker                     "  ret i8* blockaddress(@func, %bb)\n"
263*9880d681SAndroid Build Coastguard Worker                     "}\n");
264*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("after")->empty());
265*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("func")->empty());
266*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
267*9880d681SAndroid Build Coastguard Worker 
268*9880d681SAndroid Build Coastguard Worker   // Materialize @after, pulling in @func.
269*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getFunction("after")->materialize());
270*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(M->getFunction("func")->empty());
271*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(M->getFunction("other")->empty());
272*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*M, &dbgs()));
273*9880d681SAndroid Build Coastguard Worker }
274*9880d681SAndroid Build Coastguard Worker 
275*9880d681SAndroid Build Coastguard Worker } // end namespace
276