blob: fa75e00e6caa58bc749d9b40b52637b8c29f5b89 [file] [log] [blame]
Chris Lattnercaee0dc2007-04-22 06:23:29 +00001//===- BitcodeReader.cpp - Internal BitcodeReader implementation ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This header defines the BitcodeReader class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "BitcodeReader.h"
15#include "llvm/Bitcode/BitstreamReader.h"
Chris Lattnere16504e2007-04-24 03:30:34 +000016#include "llvm/Constants.h"
Chris Lattnercaee0dc2007-04-22 06:23:29 +000017#include "llvm/DerivedTypes.h"
18#include "llvm/Module.h"
Chris Lattner0b2482a2007-04-23 21:26:05 +000019#include "llvm/ADT/SmallString.h"
Chris Lattner0eef0802007-04-24 04:04:35 +000020#include "llvm/Support/MathExtras.h"
Chris Lattnercaee0dc2007-04-22 06:23:29 +000021using namespace llvm;
22
23/// ConvertToString - Convert a string from a record into an std::string, return
24/// true on failure.
Chris Lattner0b2482a2007-04-23 21:26:05 +000025template<typename StrTy>
Chris Lattnercaee0dc2007-04-22 06:23:29 +000026static bool ConvertToString(SmallVector<uint64_t, 64> &Record, unsigned Idx,
Chris Lattner0b2482a2007-04-23 21:26:05 +000027 StrTy &Result) {
Chris Lattnercaee0dc2007-04-22 06:23:29 +000028 if (Record.size() < Idx+1 || Record.size() < Record[Idx]+Idx+1)
29 return true;
30
31 for (unsigned i = 0, e = Record[Idx]; i != e; ++i)
32 Result += (char)Record[Idx+i+1];
33 return false;
34}
35
36static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {
37 switch (Val) {
38 default: // Map unknown/new linkages to external
39 case 0: return GlobalValue::ExternalLinkage;
40 case 1: return GlobalValue::WeakLinkage;
41 case 2: return GlobalValue::AppendingLinkage;
42 case 3: return GlobalValue::InternalLinkage;
43 case 4: return GlobalValue::LinkOnceLinkage;
44 case 5: return GlobalValue::DLLImportLinkage;
45 case 6: return GlobalValue::DLLExportLinkage;
46 case 7: return GlobalValue::ExternalWeakLinkage;
47 }
48}
49
50static GlobalValue::VisibilityTypes GetDecodedVisibility(unsigned Val) {
51 switch (Val) {
52 default: // Map unknown visibilities to default.
53 case 0: return GlobalValue::DefaultVisibility;
54 case 1: return GlobalValue::HiddenVisibility;
55 }
56}
57
Chris Lattner522b7b12007-04-24 05:48:56 +000058namespace {
59 /// @brief A class for maintaining the slot number definition
60 /// as a placeholder for the actual definition for forward constants defs.
61 class ConstantPlaceHolder : public ConstantExpr {
62 ConstantPlaceHolder(); // DO NOT IMPLEMENT
63 void operator=(const ConstantPlaceHolder &); // DO NOT IMPLEMENT
64public:
65 Use Op;
66 ConstantPlaceHolder(const Type *Ty)
67 : ConstantExpr(Ty, Instruction::UserOp1, &Op, 1),
68 Op(UndefValue::get(Type::Int32Ty), this) {
69 }
70 };
71}
72
73Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx,
74 const Type *Ty) {
75 if (Idx >= size()) {
76 // Insert a bunch of null values.
77 Uses.resize(Idx+1);
78 OperandList = &Uses[0];
79 NumOperands = Idx+1;
80 }
81
82 if (Uses[Idx])
83 return cast<Constant>(getOperand(Idx));
84
85 // Create and return a placeholder, which will later be RAUW'd.
86 Constant *C = new ConstantPlaceHolder(Ty);
87 Uses[Idx].init(C, this);
88 return C;
89}
90
Chris Lattnercaee0dc2007-04-22 06:23:29 +000091
92const Type *BitcodeReader::getTypeByID(unsigned ID, bool isTypeTable) {
93 // If the TypeID is in range, return it.
94 if (ID < TypeList.size())
95 return TypeList[ID].get();
96 if (!isTypeTable) return 0;
97
98 // The type table allows forward references. Push as many Opaque types as
99 // needed to get up to ID.
100 while (TypeList.size() <= ID)
101 TypeList.push_back(OpaqueType::get());
102 return TypeList.back().get();
103}
104
105
106bool BitcodeReader::ParseTypeTable(BitstreamReader &Stream) {
107 if (Stream.EnterSubBlock())
108 return Error("Malformed block record");
109
110 if (!TypeList.empty())
111 return Error("Multiple TYPE_BLOCKs found!");
112
113 SmallVector<uint64_t, 64> Record;
114 unsigned NumRecords = 0;
115
116 // Read all the records for this type table.
117 while (1) {
118 unsigned Code = Stream.ReadCode();
119 if (Code == bitc::END_BLOCK) {
120 if (NumRecords != TypeList.size())
121 return Error("Invalid type forward reference in TYPE_BLOCK");
122 return Stream.ReadBlockEnd();
123 }
124
125 if (Code == bitc::ENTER_SUBBLOCK) {
126 // No known subblocks, always skip them.
127 Stream.ReadSubBlockID();
128 if (Stream.SkipBlock())
129 return Error("Malformed block record");
130 continue;
131 }
132
Chris Lattner36d5e7d2007-04-23 16:04:05 +0000133 if (Code == bitc::DEFINE_ABBREV) {
Chris Lattnerd127c1b2007-04-23 18:58:34 +0000134 Stream.ReadAbbrevRecord();
135 continue;
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000136 }
137
138 // Read a record.
139 Record.clear();
140 const Type *ResultTy = 0;
141 switch (Stream.ReadRecord(Code, Record)) {
142 default: // Default behavior: unknown type.
143 ResultTy = 0;
144 break;
145 case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries]
146 // TYPE_CODE_NUMENTRY contains a count of the number of types in the
147 // type list. This allows us to reserve space.
148 if (Record.size() < 1)
149 return Error("Invalid TYPE_CODE_NUMENTRY record");
150 TypeList.reserve(Record[0]);
151 continue;
152 case bitc::TYPE_CODE_META: // TYPE_CODE_META: [metacode]...
153 // No metadata supported yet.
154 if (Record.size() < 1)
155 return Error("Invalid TYPE_CODE_META record");
156 continue;
157
158 case bitc::TYPE_CODE_VOID: // VOID
159 ResultTy = Type::VoidTy;
160 break;
161 case bitc::TYPE_CODE_FLOAT: // FLOAT
162 ResultTy = Type::FloatTy;
163 break;
164 case bitc::TYPE_CODE_DOUBLE: // DOUBLE
165 ResultTy = Type::DoubleTy;
166 break;
167 case bitc::TYPE_CODE_LABEL: // LABEL
168 ResultTy = Type::LabelTy;
169 break;
170 case bitc::TYPE_CODE_OPAQUE: // OPAQUE
171 ResultTy = 0;
172 break;
173 case bitc::TYPE_CODE_INTEGER: // INTEGER: [width]
174 if (Record.size() < 1)
175 return Error("Invalid Integer type record");
176
177 ResultTy = IntegerType::get(Record[0]);
178 break;
179 case bitc::TYPE_CODE_POINTER: // POINTER: [pointee type]
180 if (Record.size() < 1)
181 return Error("Invalid POINTER type record");
182 ResultTy = PointerType::get(getTypeByID(Record[0], true));
183 break;
184 case bitc::TYPE_CODE_FUNCTION: {
185 // FUNCTION: [vararg, retty, #pararms, paramty N]
186 if (Record.size() < 3 || Record.size() < Record[2]+3)
187 return Error("Invalid FUNCTION type record");
188 std::vector<const Type*> ArgTys;
189 for (unsigned i = 0, e = Record[2]; i != e; ++i)
190 ArgTys.push_back(getTypeByID(Record[3+i], true));
191
192 // FIXME: PARAM TYS.
193 ResultTy = FunctionType::get(getTypeByID(Record[1], true), ArgTys,
194 Record[0]);
195 break;
196 }
197 case bitc::TYPE_CODE_STRUCT: { // STRUCT: [ispacked, #elts, eltty x N]
198 if (Record.size() < 2 || Record.size() < Record[1]+2)
199 return Error("Invalid STRUCT type record");
200 std::vector<const Type*> EltTys;
201 for (unsigned i = 0, e = Record[1]; i != e; ++i)
202 EltTys.push_back(getTypeByID(Record[2+i], true));
203 ResultTy = StructType::get(EltTys, Record[0]);
204 break;
205 }
206 case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty]
207 if (Record.size() < 2)
208 return Error("Invalid ARRAY type record");
209 ResultTy = ArrayType::get(getTypeByID(Record[1], true), Record[0]);
210 break;
211 case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty]
212 if (Record.size() < 2)
213 return Error("Invalid VECTOR type record");
214 ResultTy = VectorType::get(getTypeByID(Record[1], true), Record[0]);
215 break;
216 }
217
218 if (NumRecords == TypeList.size()) {
219 // If this is a new type slot, just append it.
220 TypeList.push_back(ResultTy ? ResultTy : OpaqueType::get());
221 ++NumRecords;
222 } else if (ResultTy == 0) {
223 // Otherwise, this was forward referenced, so an opaque type was created,
224 // but the result type is actually just an opaque. Leave the one we
225 // created previously.
226 ++NumRecords;
227 } else {
228 // Otherwise, this was forward referenced, so an opaque type was created.
229 // Resolve the opaque type to the real type now.
230 assert(NumRecords < TypeList.size() && "Typelist imbalance");
231 const OpaqueType *OldTy = cast<OpaqueType>(TypeList[NumRecords++].get());
232
233 // Don't directly push the new type on the Tab. Instead we want to replace
234 // the opaque type we previously inserted with the new concrete value. The
235 // refinement from the abstract (opaque) type to the new type causes all
236 // uses of the abstract type to use the concrete type (NewTy). This will
237 // also cause the opaque type to be deleted.
238 const_cast<OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy);
239
240 // This should have replaced the old opaque type with the new type in the
Chris Lattner0eef0802007-04-24 04:04:35 +0000241 // value table... or with a preexisting type that was already in the
242 // system. Let's just make sure it did.
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000243 assert(TypeList[NumRecords-1].get() != OldTy &&
244 "refineAbstractType didn't work!");
245 }
246 }
247}
248
249
250bool BitcodeReader::ParseTypeSymbolTable(BitstreamReader &Stream) {
251 if (Stream.EnterSubBlock())
252 return Error("Malformed block record");
253
254 SmallVector<uint64_t, 64> Record;
255
256 // Read all the records for this type table.
257 std::string TypeName;
258 while (1) {
259 unsigned Code = Stream.ReadCode();
260 if (Code == bitc::END_BLOCK)
261 return Stream.ReadBlockEnd();
262
263 if (Code == bitc::ENTER_SUBBLOCK) {
264 // No known subblocks, always skip them.
265 Stream.ReadSubBlockID();
266 if (Stream.SkipBlock())
267 return Error("Malformed block record");
268 continue;
269 }
270
Chris Lattner36d5e7d2007-04-23 16:04:05 +0000271 if (Code == bitc::DEFINE_ABBREV) {
Chris Lattnerd127c1b2007-04-23 18:58:34 +0000272 Stream.ReadAbbrevRecord();
273 continue;
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000274 }
275
276 // Read a record.
277 Record.clear();
278 switch (Stream.ReadRecord(Code, Record)) {
279 default: // Default behavior: unknown type.
280 break;
Chris Lattner6dbfd7b2007-04-24 00:18:21 +0000281 case bitc::TST_CODE_ENTRY: // TST_ENTRY: [typeid, namelen, namechar x N]
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000282 if (ConvertToString(Record, 1, TypeName))
283 return Error("Invalid TST_ENTRY record");
284 unsigned TypeID = Record[0];
285 if (TypeID >= TypeList.size())
286 return Error("Invalid Type ID in TST_ENTRY record");
287
288 TheModule->addTypeName(TypeName, TypeList[TypeID].get());
289 TypeName.clear();
290 break;
291 }
292 }
293}
294
Chris Lattner0b2482a2007-04-23 21:26:05 +0000295bool BitcodeReader::ParseValueSymbolTable(BitstreamReader &Stream) {
296 if (Stream.EnterSubBlock())
297 return Error("Malformed block record");
298
299 SmallVector<uint64_t, 64> Record;
300
301 // Read all the records for this value table.
302 SmallString<128> ValueName;
303 while (1) {
304 unsigned Code = Stream.ReadCode();
305 if (Code == bitc::END_BLOCK)
306 return Stream.ReadBlockEnd();
307
308 if (Code == bitc::ENTER_SUBBLOCK) {
309 // No known subblocks, always skip them.
310 Stream.ReadSubBlockID();
311 if (Stream.SkipBlock())
312 return Error("Malformed block record");
313 continue;
314 }
315
316 if (Code == bitc::DEFINE_ABBREV) {
317 Stream.ReadAbbrevRecord();
318 continue;
319 }
320
321 // Read a record.
322 Record.clear();
323 switch (Stream.ReadRecord(Code, Record)) {
324 default: // Default behavior: unknown type.
325 break;
Chris Lattner6dbfd7b2007-04-24 00:18:21 +0000326 case bitc::TST_CODE_ENTRY: // VST_ENTRY: [valueid, namelen, namechar x N]
Chris Lattner0b2482a2007-04-23 21:26:05 +0000327 if (ConvertToString(Record, 1, ValueName))
328 return Error("Invalid TST_ENTRY record");
329 unsigned ValueID = Record[0];
330 if (ValueID >= ValueList.size())
331 return Error("Invalid Value ID in VST_ENTRY record");
332 Value *V = ValueList[ValueID];
333
334 V->setName(&ValueName[0], ValueName.size());
335 ValueName.clear();
336 break;
337 }
338 }
339}
340
Chris Lattner0eef0802007-04-24 04:04:35 +0000341/// DecodeSignRotatedValue - Decode a signed value stored with the sign bit in
342/// the LSB for dense VBR encoding.
343static uint64_t DecodeSignRotatedValue(uint64_t V) {
344 if ((V & 1) == 0)
345 return V >> 1;
346 if (V != 1)
347 return -(V >> 1);
348 // There is no such thing as -0 with integers. "-0" really means MININT.
349 return 1ULL << 63;
350}
351
Chris Lattnere16504e2007-04-24 03:30:34 +0000352bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
353 if (Stream.EnterSubBlock())
354 return Error("Malformed block record");
355
356 SmallVector<uint64_t, 64> Record;
357
358 // Read all the records for this value table.
359 const Type *CurTy = Type::Int32Ty;
Chris Lattner522b7b12007-04-24 05:48:56 +0000360 unsigned NextCstNo = ValueList.size();
Chris Lattnere16504e2007-04-24 03:30:34 +0000361 while (1) {
362 unsigned Code = Stream.ReadCode();
363 if (Code == bitc::END_BLOCK) {
364 // If there are global var inits to process, do so now.
365 if (!GlobalInits.empty()) {
366 while (!GlobalInits.empty()) {
367 unsigned ValID = GlobalInits.back().second;
368 if (ValID >= ValueList.size())
369 return Error("Invalid value ID for global var init!");
370 if (Constant *C = dyn_cast<Constant>(ValueList[ValID]))
371 GlobalInits.back().first->setInitializer(C);
372 else
373 return Error("Global variable initializer is not a constant!");
374 GlobalInits.pop_back();
375 }
376 }
377
Chris Lattner522b7b12007-04-24 05:48:56 +0000378 if (NextCstNo != ValueList.size())
379 return Error("Invalid constant reference!");
380
Chris Lattnere16504e2007-04-24 03:30:34 +0000381 return Stream.ReadBlockEnd();
382 }
383
384 if (Code == bitc::ENTER_SUBBLOCK) {
385 // No known subblocks, always skip them.
386 Stream.ReadSubBlockID();
387 if (Stream.SkipBlock())
388 return Error("Malformed block record");
389 continue;
390 }
391
392 if (Code == bitc::DEFINE_ABBREV) {
393 Stream.ReadAbbrevRecord();
394 continue;
395 }
396
397 // Read a record.
398 Record.clear();
399 Value *V = 0;
400 switch (Stream.ReadRecord(Code, Record)) {
401 default: // Default behavior: unknown constant
402 case bitc::CST_CODE_UNDEF: // UNDEF
403 V = UndefValue::get(CurTy);
404 break;
405 case bitc::CST_CODE_SETTYPE: // SETTYPE: [typeid]
406 if (Record.empty())
407 return Error("Malformed CST_SETTYPE record");
408 if (Record[0] >= TypeList.size())
409 return Error("Invalid Type ID in CST_SETTYPE record");
410 CurTy = TypeList[Record[0]];
Chris Lattner0eef0802007-04-24 04:04:35 +0000411 continue; // Skip the ValueList manipulation.
Chris Lattnere16504e2007-04-24 03:30:34 +0000412 case bitc::CST_CODE_NULL: // NULL
413 V = Constant::getNullValue(CurTy);
414 break;
415 case bitc::CST_CODE_INTEGER: // INTEGER: [intval]
Chris Lattner0eef0802007-04-24 04:04:35 +0000416 if (!isa<IntegerType>(CurTy) || Record.empty())
417 return Error("Invalid CST_INTEGER record");
418 V = ConstantInt::get(CurTy, DecodeSignRotatedValue(Record[0]));
419 break;
420 case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n, n x intval]
421 if (!isa<IntegerType>(CurTy) || Record.empty() ||
422 Record.size() < Record[0]+1)
423 return Error("Invalid WIDE_INTEGER record");
424
425 unsigned NumWords = Record[0];
426 uint64_t *Data = new uint64_t[NumWords];
427 for (unsigned i = 0; i != NumWords; ++i)
428 Data[i] = DecodeSignRotatedValue(Record[i+1]);
429 V = ConstantInt::get(APInt(cast<IntegerType>(CurTy)->getBitWidth(),
430 NumWords, Data));
431 break;
432 }
433 case bitc::CST_CODE_FLOAT: // FLOAT: [fpval]
434 if (Record.empty())
435 return Error("Invalid FLOAT record");
436 if (CurTy == Type::FloatTy)
437 V = ConstantFP::get(CurTy, BitsToFloat(Record[0]));
438 else if (CurTy == Type::DoubleTy)
439 V = ConstantFP::get(CurTy, BitsToDouble(Record[0]));
Chris Lattnere16504e2007-04-24 03:30:34 +0000440 else
Chris Lattner0eef0802007-04-24 04:04:35 +0000441 V = UndefValue::get(CurTy);
Chris Lattnere16504e2007-04-24 03:30:34 +0000442 break;
Chris Lattner522b7b12007-04-24 05:48:56 +0000443
444 case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n, n x value number]
445 if (Record.empty() || Record.size() < Record[0]+1)
446 return Error("Invalid CST_AGGREGATE record");
447
448 unsigned Size = Record[0];
449 std::vector<Constant*> Elts;
450
451 if (const StructType *STy = dyn_cast<StructType>(CurTy)) {
452 for (unsigned i = 0; i != Size; ++i)
453 Elts.push_back(ValueList.getConstantFwdRef(Record[i+1],
454 STy->getElementType(i)));
455 V = ConstantStruct::get(STy, Elts);
456 } else if (const ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) {
457 const Type *EltTy = ATy->getElementType();
458 for (unsigned i = 0; i != Size; ++i)
459 Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
460 V = ConstantArray::get(ATy, Elts);
461 } else if (const VectorType *VTy = dyn_cast<VectorType>(CurTy)) {
462 const Type *EltTy = VTy->getElementType();
463 for (unsigned i = 0; i != Size; ++i)
464 Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
465 V = ConstantVector::get(Elts);
466 } else {
467 V = UndefValue::get(CurTy);
468 }
469 }
Chris Lattnere16504e2007-04-24 03:30:34 +0000470 }
471
Chris Lattner522b7b12007-04-24 05:48:56 +0000472 if (NextCstNo == ValueList.size())
473 ValueList.push_back(V);
474 else if (ValueList[NextCstNo] == 0)
475 ValueList.initVal(NextCstNo, V);
476 else {
477 // If there was a forward reference to this constant,
478 Value *OldV = ValueList[NextCstNo];
479 ValueList.setOperand(NextCstNo, V);
480 OldV->replaceAllUsesWith(V);
481 delete OldV;
482 }
483
484 ++NextCstNo;
Chris Lattnere16504e2007-04-24 03:30:34 +0000485 }
486}
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000487
488bool BitcodeReader::ParseModule(BitstreamReader &Stream,
489 const std::string &ModuleID) {
490 // Reject multiple MODULE_BLOCK's in a single bitstream.
491 if (TheModule)
492 return Error("Multiple MODULE_BLOCKs in same stream");
493
494 if (Stream.EnterSubBlock())
495 return Error("Malformed block record");
496
497 // Otherwise, create the module.
498 TheModule = new Module(ModuleID);
499
500 SmallVector<uint64_t, 64> Record;
501 std::vector<std::string> SectionTable;
502
503 // Read all the records for this module.
504 while (!Stream.AtEndOfStream()) {
505 unsigned Code = Stream.ReadCode();
Chris Lattnere84bcb92007-04-24 00:21:45 +0000506 if (Code == bitc::END_BLOCK) {
507 if (!GlobalInits.empty())
508 return Error("Malformed global initializer set");
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000509 return Stream.ReadBlockEnd();
Chris Lattnere84bcb92007-04-24 00:21:45 +0000510 }
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000511
512 if (Code == bitc::ENTER_SUBBLOCK) {
513 switch (Stream.ReadSubBlockID()) {
514 default: // Skip unknown content.
515 if (Stream.SkipBlock())
516 return Error("Malformed block record");
517 break;
518 case bitc::TYPE_BLOCK_ID:
519 if (ParseTypeTable(Stream))
520 return true;
521 break;
522 case bitc::TYPE_SYMTAB_BLOCK_ID:
523 if (ParseTypeSymbolTable(Stream))
524 return true;
525 break;
Chris Lattner0b2482a2007-04-23 21:26:05 +0000526 case bitc::VALUE_SYMTAB_BLOCK_ID:
527 if (ParseValueSymbolTable(Stream))
528 return true;
529 break;
Chris Lattnere16504e2007-04-24 03:30:34 +0000530 case bitc::CONSTANTS_BLOCK_ID:
531 if (ParseConstants(Stream))
532 return true;
533 break;
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000534 }
535 continue;
536 }
537
Chris Lattner36d5e7d2007-04-23 16:04:05 +0000538 if (Code == bitc::DEFINE_ABBREV) {
Chris Lattnerd127c1b2007-04-23 18:58:34 +0000539 Stream.ReadAbbrevRecord();
540 continue;
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000541 }
542
543 // Read a record.
544 switch (Stream.ReadRecord(Code, Record)) {
545 default: break; // Default behavior, ignore unknown content.
546 case bitc::MODULE_CODE_VERSION: // VERSION: [version#]
547 if (Record.size() < 1)
548 return Error("Malformed MODULE_CODE_VERSION");
549 // Only version #0 is supported so far.
550 if (Record[0] != 0)
551 return Error("Unknown bitstream version!");
552 break;
553 case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strlen, strchr x N]
554 std::string S;
555 if (ConvertToString(Record, 0, S))
556 return Error("Invalid MODULE_CODE_TRIPLE record");
557 TheModule->setTargetTriple(S);
558 break;
559 }
560 case bitc::MODULE_CODE_DATALAYOUT: { // DATALAYOUT: [strlen, strchr x N]
561 std::string S;
562 if (ConvertToString(Record, 0, S))
563 return Error("Invalid MODULE_CODE_DATALAYOUT record");
564 TheModule->setDataLayout(S);
565 break;
566 }
567 case bitc::MODULE_CODE_ASM: { // ASM: [strlen, strchr x N]
568 std::string S;
569 if (ConvertToString(Record, 0, S))
570 return Error("Invalid MODULE_CODE_ASM record");
571 TheModule->setModuleInlineAsm(S);
572 break;
573 }
574 case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strlen, strchr x N]
575 std::string S;
576 if (ConvertToString(Record, 0, S))
577 return Error("Invalid MODULE_CODE_DEPLIB record");
578 TheModule->addLibrary(S);
579 break;
580 }
581 case bitc::MODULE_CODE_SECTIONNAME: { // SECTIONNAME: [strlen, strchr x N]
582 std::string S;
583 if (ConvertToString(Record, 0, S))
584 return Error("Invalid MODULE_CODE_SECTIONNAME record");
585 SectionTable.push_back(S);
586 break;
587 }
588 // GLOBALVAR: [type, isconst, initid,
589 // linkage, alignment, section, visibility, threadlocal]
590 case bitc::MODULE_CODE_GLOBALVAR: {
Chris Lattner36d5e7d2007-04-23 16:04:05 +0000591 if (Record.size() < 6)
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000592 return Error("Invalid MODULE_CODE_GLOBALVAR record");
593 const Type *Ty = getTypeByID(Record[0]);
594 if (!isa<PointerType>(Ty))
595 return Error("Global not a pointer type!");
596 Ty = cast<PointerType>(Ty)->getElementType();
597
598 bool isConstant = Record[1];
599 GlobalValue::LinkageTypes Linkage = GetDecodedLinkage(Record[3]);
600 unsigned Alignment = (1 << Record[4]) >> 1;
601 std::string Section;
602 if (Record[5]) {
603 if (Record[5]-1 >= SectionTable.size())
604 return Error("Invalid section ID");
605 Section = SectionTable[Record[5]-1];
606 }
Chris Lattner36d5e7d2007-04-23 16:04:05 +0000607 GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility;
608 if (Record.size() >= 6) Visibility = GetDecodedVisibility(Record[6]);
609 bool isThreadLocal = false;
610 if (Record.size() >= 7) isThreadLocal = Record[7];
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000611
612 GlobalVariable *NewGV =
613 new GlobalVariable(Ty, isConstant, Linkage, 0, "", TheModule);
614 NewGV->setAlignment(Alignment);
615 if (!Section.empty())
616 NewGV->setSection(Section);
617 NewGV->setVisibility(Visibility);
618 NewGV->setThreadLocal(isThreadLocal);
619
Chris Lattner0b2482a2007-04-23 21:26:05 +0000620 ValueList.push_back(NewGV);
621
Chris Lattner6dbfd7b2007-04-24 00:18:21 +0000622 // Remember which value to use for the global initializer.
623 if (unsigned InitID = Record[2])
624 GlobalInits.push_back(std::make_pair(NewGV, InitID-1));
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000625 break;
626 }
627 // FUNCTION: [type, callingconv, isproto, linkage, alignment, section,
628 // visibility]
629 case bitc::MODULE_CODE_FUNCTION: {
630 if (Record.size() < 7)
631 return Error("Invalid MODULE_CODE_FUNCTION record");
632 const Type *Ty = getTypeByID(Record[0]);
633 if (!isa<PointerType>(Ty))
634 return Error("Function not a pointer type!");
635 const FunctionType *FTy =
636 dyn_cast<FunctionType>(cast<PointerType>(Ty)->getElementType());
637 if (!FTy)
638 return Error("Function not a pointer to function type!");
639
640 Function *Func = new Function(FTy, GlobalValue::ExternalLinkage,
641 "", TheModule);
642
643 Func->setCallingConv(Record[1]);
644 Func->setLinkage(GetDecodedLinkage(Record[3]));
645 Func->setAlignment((1 << Record[4]) >> 1);
646 if (Record[5]) {
647 if (Record[5]-1 >= SectionTable.size())
648 return Error("Invalid section ID");
649 Func->setSection(SectionTable[Record[5]-1]);
650 }
651 Func->setVisibility(GetDecodedVisibility(Record[6]));
652
Chris Lattner0b2482a2007-04-23 21:26:05 +0000653 ValueList.push_back(Func);
Chris Lattnercaee0dc2007-04-22 06:23:29 +0000654 // TODO: remember initializer/global pair for later substitution.
655 break;
656 }
657 }
658 Record.clear();
659 }
660
661 return Error("Premature end of bitstream");
662}
663
664
665bool BitcodeReader::ParseBitcode(unsigned char *Buf, unsigned Length,
666 const std::string &ModuleID) {
667 TheModule = 0;
668
669 if (Length & 3)
670 return Error("Bitcode stream should be a multiple of 4 bytes in length");
671
672 BitstreamReader Stream(Buf, Buf+Length);
673
674 // Sniff for the signature.
675 if (Stream.Read(8) != 'B' ||
676 Stream.Read(8) != 'C' ||
677 Stream.Read(4) != 0x0 ||
678 Stream.Read(4) != 0xC ||
679 Stream.Read(4) != 0xE ||
680 Stream.Read(4) != 0xD)
681 return Error("Invalid bitcode signature");
682
683 // We expect a number of well-defined blocks, though we don't necessarily
684 // need to understand them all.
685 while (!Stream.AtEndOfStream()) {
686 unsigned Code = Stream.ReadCode();
687
688 if (Code != bitc::ENTER_SUBBLOCK)
689 return Error("Invalid record at top-level");
690
691 unsigned BlockID = Stream.ReadSubBlockID();
692
693 // We only know the MODULE subblock ID.
694 if (BlockID == bitc::MODULE_BLOCK_ID) {
695 if (ParseModule(Stream, ModuleID))
696 return true;
697 } else if (Stream.SkipBlock()) {
698 return Error("Malformed block record");
699 }
700 }
701
702 return false;
703}