s/Method/Function in variable and method names
[oota-llvm.git] / lib / Bytecode / Reader / Reader.cpp
1 //===- Reader.cpp - Code to read bytecode files ---------------------------===//
2 //
3 // This library implements the functionality defined in llvm/Bytecode/Reader.h
4 //
5 // Note that this library should be as fast as possible, reentrant, and 
6 // threadsafe!!
7 //
8 // TODO: Return error messages to caller instead of printing them out directly.
9 // TODO: Allow passing in an option to ignore the symbol table
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "ReaderInternals.h"
14 #include "llvm/Bytecode/Reader.h"
15 #include "llvm/Bytecode/Format.h"
16 #include "llvm/Module.h"
17 #include "llvm/Constants.h"
18 #include "llvm/iPHINode.h"
19 #include "llvm/iOther.h"
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <sys/mman.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <algorithm>
26
27 bool BytecodeParser::getTypeSlot(const Type *Ty, unsigned &Slot) {
28   if (Ty->isPrimitiveType()) {
29     Slot = Ty->getPrimitiveID();
30   } else {
31     // Check the function level types first...
32     TypeValuesListTy::iterator I = find(FunctionTypeValues.begin(),
33                                         FunctionTypeValues.end(), Ty);
34     if (I != FunctionTypeValues.end()) {
35       Slot = FirstDerivedTyID+ModuleTypeValues.size()+
36              (&*I - &FunctionTypeValues[0]);
37     } else {
38       I = find(ModuleTypeValues.begin(), ModuleTypeValues.end(), Ty);
39       if (I == ModuleTypeValues.end()) return true;   // Didn't find type!
40       Slot = FirstDerivedTyID + (&*I - &ModuleTypeValues[0]);
41     }
42   }
43   //cerr << "getTypeSlot '" << Ty->getName() << "' = " << Slot << "\n";
44   return false;
45 }
46
47 const Type *BytecodeParser::getType(unsigned ID) {
48   if (ID < Type::NumPrimitiveIDs) {
49     const Type *T = Type::getPrimitiveType((Type::PrimitiveID)ID);
50     if (T) return T;
51   }
52   
53   //cerr << "Looking up Type ID: " << ID << "\n";
54   const Value *V = getValue(Type::TypeTy, ID, false);
55   return cast_or_null<Type>(V);
56 }
57
58 int BytecodeParser::insertValue(Value *Val, std::vector<ValueList> &ValueTab) {
59   unsigned type;
60   if (getTypeSlot(Val->getType(), type)) return -1;
61   assert(type != Type::TypeTyID && "Types should never be insertValue'd!");
62  
63   if (ValueTab.size() <= type)
64     ValueTab.resize(type+1, ValueList());
65
66   //cerr << "insertValue Values[" << type << "][" << ValueTab[type].size() 
67   //     << "] = " << Val << "\n";
68   ValueTab[type].push_back(Val);
69
70   return ValueTab[type].size()-1;
71 }
72
73 Value *BytecodeParser::getValue(const Type *Ty, unsigned oNum, bool Create) {
74   unsigned Num = oNum;
75   unsigned type;   // The type plane it lives in...
76
77   if (getTypeSlot(Ty, type)) return 0;
78
79   if (type == Type::TypeTyID) {  // The 'type' plane has implicit values
80     assert(Create == false);
81     if (Num < Type::NumPrimitiveIDs) {
82       const Type *T = Type::getPrimitiveType((Type::PrimitiveID)Num);
83       if (T) return (Value*)T;   // Asked for a primitive type...
84     }
85
86     // Otherwise, derived types need offset...
87     Num -= FirstDerivedTyID;
88
89     // Is it a module level type?
90     if (Num < ModuleTypeValues.size())
91       return (Value*)ModuleTypeValues[Num].get();
92
93     // Nope, is it a function level type?
94     Num -= ModuleTypeValues.size();
95     if (Num < FunctionTypeValues.size())
96       return (Value*)FunctionTypeValues[Num].get();
97
98     return 0;
99   }
100
101   if (type < ModuleValues.size()) {
102     if (Num < ModuleValues[type].size())
103       return ModuleValues[type][Num];
104     Num -= ModuleValues[type].size();
105   }
106
107   if (Values.size() > type && Values[type].size() > Num)
108     return Values[type][Num];
109
110   if (!Create) return 0;  // Do not create a placeholder?
111
112   Value *d = 0;
113   switch (Ty->getPrimitiveID()) {
114   case Type::FunctionTyID:
115     std::cerr << "Creating function pholder! : " << type << ":" << oNum << " " 
116               << Ty->getName() << "\n";
117     d = new FunctionPHolder(Ty, oNum);
118     if (insertValue(d, LateResolveModuleValues) == -1) return 0;
119     return d;
120   case Type::LabelTyID:
121     d = new BBPHolder(Ty, oNum);
122     break;
123   default:
124     d = new ValPHolder(Ty, oNum);
125     break;
126   }
127
128   assert(d != 0 && "How did we not make something?");
129   if (insertValue(d, LateResolveValues) == -1) return 0;
130   return d;
131 }
132
133 /// getConstantValue - Just like getValue, except that it returns a null pointer
134 /// only on error.  It always returns a constant (meaning that if the value is
135 /// defined, but is not a constant, that is an error).  If the specified
136 /// constant hasn't been parsed yet, a placeholder is defined and used.  Later,
137 /// after the real value is parsed, the placeholder is eliminated.
138 ///
139 Constant *BytecodeParser::getConstantValue(const Type *Ty, unsigned Slot) {
140   if (Value *V = getValue(Ty, Slot, false))
141     return dyn_cast<Constant>(V);      // If we already have the value parsed...
142
143   GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(Ty, Slot));
144   if (I != GlobalRefs.end()) {
145     BCR_TRACE(5, "Previous forward ref found!\n");
146     return cast<Constant>(I->second);
147   } else {
148     // Create a placeholder for the constant reference and
149     // keep track of the fact that we have a forward ref to recycle it
150     BCR_TRACE(5, "Creating new forward ref to a constant!\n");
151     Constant *C = new ConstPHolder(Ty, Slot);
152     
153     // Keep track of the fact that we have a forward ref to recycle it
154     GlobalRefs.insert(std::make_pair(std::make_pair(Ty, Slot), C));
155     return C;
156   }
157 }
158
159
160
161 bool BytecodeParser::postResolveValues(ValueTable &ValTab) {
162   bool Error = false;
163   for (unsigned ty = 0; ty < ValTab.size(); ++ty) {
164     ValueList &DL = ValTab[ty];
165     unsigned Size;
166     while ((Size = DL.size())) {
167       unsigned IDNumber = getValueIDNumberFromPlaceHolder(DL[Size-1]);
168
169       Value *D = DL[Size-1];
170       DL.pop_back();
171
172       Value *NewDef = getValue(D->getType(), IDNumber, false);
173       if (NewDef == 0) {
174         Error = true;  // Unresolved thinger
175         std::cerr << "Unresolvable reference found: <"
176                   << D->getType()->getDescription() << ">:" << IDNumber <<"!\n";
177       } else {
178         // Fixup all of the uses of this placeholder def...
179         D->replaceAllUsesWith(NewDef);
180
181         // Now that all the uses are gone, delete the placeholder...
182         // If we couldn't find a def (error case), then leak a little
183         delete D;  // memory, 'cause otherwise we can't remove all uses!
184       }
185     }
186   }
187
188   return Error;
189 }
190
191 bool BytecodeParser::ParseBasicBlock(const uchar *&Buf, const uchar *EndBuf, 
192                                      BasicBlock *&BB) {
193   BB = new BasicBlock();
194
195   while (Buf < EndBuf) {
196     Instruction *Inst;
197     if (ParseInstruction(Buf, EndBuf, Inst,
198                          /*HACK*/BB)) {
199       delete BB;
200       return true;
201     }
202
203     if (Inst == 0) { delete BB; return true; }
204     if (insertValue(Inst, Values) == -1) { delete BB; return true; }
205
206     BB->getInstList().push_back(Inst);
207
208     BCR_TRACE(4, Inst);
209   }
210
211   return false;
212 }
213
214 bool BytecodeParser::ParseSymbolTable(const uchar *&Buf, const uchar *EndBuf,
215                                       SymbolTable *ST) {
216   while (Buf < EndBuf) {
217     // Symtab block header: [num entries][type id number]
218     unsigned NumEntries, Typ;
219     if (read_vbr(Buf, EndBuf, NumEntries) ||
220         read_vbr(Buf, EndBuf, Typ)) return true;
221     const Type *Ty = getType(Typ);
222     if (Ty == 0) return true;
223
224     BCR_TRACE(3, "Plane Type: '" << Ty << "' with " << NumEntries <<
225               " entries\n");
226
227     for (unsigned i = 0; i < NumEntries; ++i) {
228       // Symtab entry: [def slot #][name]
229       unsigned slot;
230       if (read_vbr(Buf, EndBuf, slot)) return true;
231       std::string Name;
232       if (read(Buf, EndBuf, Name, false))  // Not aligned...
233         return true;
234
235       Value *D = getValue(Ty, slot, false); // Find mapping...
236       if (D == 0) {
237         BCR_TRACE(3, "FAILED LOOKUP: Slot #" << slot << "\n");
238         return true;
239       }
240       BCR_TRACE(4, "Map: '" << Name << "' to #" << slot << ":" << D;
241                 if (!isa<Instruction>(D)) std::cerr << "\n");
242
243       D->setName(Name, ST);
244     }
245   }
246
247   if (Buf > EndBuf) return true;
248   return false;
249 }
250
251 void BytecodeParser::ResolveReferencesToValue(Value *NewV, unsigned Slot) {
252   GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(NewV->getType(),
253                                                               Slot));
254   if (I == GlobalRefs.end()) return;   // Never forward referenced?
255
256   BCR_TRACE(3, "Mutating forward refs!\n");
257   Value *VPH = I->second;   // Get the placeholder...
258
259   // Loop over all of the uses of the Value.  What they are depends
260   // on what NewV is.  Replacing a use of the old reference takes the
261   // use off the use list, so loop with !use_empty(), not the use_iterator.
262   while (!VPH->use_empty()) {
263     Constant *C = cast<Constant>(VPH->use_back());
264     unsigned numReplaced = C->mutateReferences(VPH, NewV);
265     assert(numReplaced > 0 && "Supposed user wasn't really a user?");
266       
267     if (GlobalValue* GVal = dyn_cast<GlobalValue>(NewV)) {
268       // Remove the placeholder GlobalValue from the module...
269       GVal->getParent()->getGlobalList().remove(cast<GlobalVariable>(VPH));
270     }
271   }
272
273   delete VPH;                         // Delete the old placeholder
274   GlobalRefs.erase(I);                // Remove the map entry for it
275 }
276
277 bool BytecodeParser::ParseFunction(const uchar *&Buf, const uchar *EndBuf) {
278   // Clear out the local values table...
279   Values.clear();
280   if (FunctionSignatureList.empty()) {
281     Error = "Function found, but FunctionSignatureList empty!";
282     return true;  // Unexpected function!
283   }
284
285   const PointerType *PMTy = FunctionSignatureList.back().first; // PtrMeth
286   const FunctionType *MTy  = dyn_cast<FunctionType>(PMTy->getElementType());
287   if (MTy == 0) return true;  // Not ptr to function!
288
289   unsigned isInternal;
290   if (read_vbr(Buf, EndBuf, isInternal)) return true;
291
292   unsigned MethSlot = FunctionSignatureList.back().second;
293   FunctionSignatureList.pop_back();
294   Function *M = new Function(MTy, isInternal != 0);
295
296   BCR_TRACE(2, "FUNCTION TYPE: " << MTy << "\n");
297
298   const FunctionType::ParamTypes &Params = MTy->getParamTypes();
299   Function::aiterator AI = M->abegin();
300   for (FunctionType::ParamTypes::const_iterator It = Params.begin();
301        It != Params.end(); ++It, ++AI) {
302     if (insertValue(AI, Values) == -1) {
303       Error = "Error reading function arguments!\n";
304       delete M; return true; 
305     }
306   }
307
308   while (Buf < EndBuf) {
309     unsigned Type, Size;
310     const unsigned char *OldBuf = Buf;
311     if (readBlock(Buf, EndBuf, Type, Size)) {
312       Error = "Error reading Function level block!";
313       delete M; return true; 
314     }
315
316     switch (Type) {
317     case BytecodeFormat::ConstantPool:
318       BCR_TRACE(2, "BLOCK BytecodeFormat::ConstantPool: {\n");
319       if (ParseConstantPool(Buf, Buf+Size, Values, FunctionTypeValues)) {
320         delete M; return true;
321       }
322       break;
323
324     case BytecodeFormat::BasicBlock: {
325       BCR_TRACE(2, "BLOCK BytecodeFormat::BasicBlock: {\n");
326       BasicBlock *BB;
327       if (ParseBasicBlock(Buf, Buf+Size, BB) ||
328           insertValue(BB, Values) == -1) {
329         delete M; return true;                // Parse error... :(
330       }
331
332       M->getBasicBlockList().push_back(BB);
333       break;
334     }
335
336     case BytecodeFormat::SymbolTable:
337       BCR_TRACE(2, "BLOCK BytecodeFormat::SymbolTable: {\n");
338       if (ParseSymbolTable(Buf, Buf+Size, &M->getSymbolTable())) {
339         delete M; return true;
340       }
341       break;
342
343     default:
344       BCR_TRACE(2, "BLOCK <unknown>:ignored! {\n");
345       Buf += Size;
346       if (OldBuf > Buf) return true; // Wrap around!
347       break;
348     }
349     BCR_TRACE(2, "} end block\n");
350
351     if (align32(Buf, EndBuf)) {
352       Error = "Error aligning Function level block!";
353       delete M;    // Malformed bc file, read past end of block.
354       return true;
355     }
356   }
357
358   if (postResolveValues(LateResolveValues) ||
359       postResolveValues(LateResolveModuleValues)) {
360     Error = "Error resolving function values!";
361     delete M; return true;     // Unresolvable references!
362   }
363
364   Value *FunctionPHolder = getValue(PMTy, MethSlot, false);
365   assert(FunctionPHolder && "Something is broken, no placeholder found!");
366   assert(isa<Function>(FunctionPHolder) && "Not a function?");
367
368   unsigned type;  // Type slot
369   assert(!getTypeSlot(MTy, type) && "How can meth type not exist?");
370   getTypeSlot(PMTy, type);
371
372   TheModule->getFunctionList().push_back(M);
373
374   // Replace placeholder with the real function pointer...
375   ModuleValues[type][MethSlot] = M;
376
377   // Clear out function level types...
378   FunctionTypeValues.clear();
379
380   // If anyone is using the placeholder make them use the real function instead
381   FunctionPHolder->replaceAllUsesWith(M);
382
383   // We don't need the placeholder anymore!
384   delete FunctionPHolder;
385
386   ResolveReferencesToValue(M, MethSlot);
387
388   return false;
389 }
390
391 bool BytecodeParser::ParseModuleGlobalInfo(const uchar *&Buf, const uchar *End){
392   if (!FunctionSignatureList.empty()) {
393     Error = "Two ModuleGlobalInfo packets found!";
394     return true;  // Two ModuleGlobal blocks?
395   }
396
397   // Read global variables...
398   unsigned VarType;
399   if (read_vbr(Buf, End, VarType)) return true;
400   while (VarType != Type::VoidTyID) { // List is terminated by Void
401     // VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
402     // bit2 = isInternal, bit3+ = slot#
403     const Type *Ty = getType(VarType >> 3);
404     if (!Ty || !isa<PointerType>(Ty)) { 
405       Error = "Global not pointer type!  Ty = " + Ty->getDescription();
406       return true; 
407     }
408
409     const PointerType *PTy = cast<const PointerType>(Ty);
410     const Type *ElTy = PTy->getElementType();
411
412     Constant *Initializer = 0;
413     if (VarType & 2) { // Does it have an initalizer?
414       // Do not improvise... values must have been stored in the constant pool,
415       // which should have been read before now.
416       //
417       unsigned InitSlot;
418       if (read_vbr(Buf, End, InitSlot)) return true;
419       
420       Value *V = getValue(ElTy, InitSlot, false);
421       if (V == 0) return true;
422       Initializer = cast<Constant>(V);
423     }
424
425     // Create the global variable...
426     GlobalVariable *GV = new GlobalVariable(ElTy, VarType & 1, VarType & 4,
427                                             Initializer);
428     int DestSlot = insertValue(GV, ModuleValues);
429     if (DestSlot == -1) return true;
430
431     TheModule->getGlobalList().push_back(GV);
432
433     ResolveReferencesToValue(GV, (unsigned)DestSlot);
434
435     BCR_TRACE(2, "Global Variable of type: " << PTy->getDescription() 
436               << " into slot #" << DestSlot << "\n");
437
438     if (read_vbr(Buf, End, VarType)) return true;
439   }
440
441   // Read the function signatures for all of the functions that are coming, and 
442   // create fillers in the Value tables.
443   unsigned FnSignature;
444   if (read_vbr(Buf, End, FnSignature)) return true;
445   while (FnSignature != Type::VoidTyID) { // List is terminated by Void
446     const Type *Ty = getType(FnSignature);
447     if (!Ty || !isa<PointerType>(Ty) ||
448         !isa<FunctionType>(cast<PointerType>(Ty)->getElementType())) { 
449       Error = "Function not ptr to func type!  Ty = " + Ty->getDescription();
450       return true; 
451     }
452
453     // We create functions by passing the underlying FunctionType to create...
454     Ty = cast<PointerType>(Ty)->getElementType();
455
456     // When the ModuleGlobalInfo section is read, we load the type of each
457     // function and the 'ModuleValues' slot that it lands in.  We then load a
458     // placeholder into its slot to reserve it.  When the function is loaded,
459     // this placeholder is replaced.
460
461     // Insert the placeholder...
462     Value *Val = new FunctionPHolder(Ty, 0);
463     if (insertValue(Val, ModuleValues) == -1) return true;
464
465     // Figure out which entry of its typeslot it went into...
466     unsigned TypeSlot;
467     if (getTypeSlot(Val->getType(), TypeSlot)) return true;
468
469     unsigned SlotNo = ModuleValues[TypeSlot].size()-1;
470     
471     // Keep track of this information in a linked list that is emptied as 
472     // functions are loaded...
473     //
474     FunctionSignatureList.push_back(
475            std::make_pair(cast<const PointerType>(Val->getType()), SlotNo));
476     if (read_vbr(Buf, End, FnSignature)) return true;
477     BCR_TRACE(2, "Function of type: " << Ty << "\n");
478   }
479
480   if (align32(Buf, End)) return true;
481
482   // Now that the function signature list is set up, reverse it so that we can 
483   // remove elements efficiently from the back of the vector.
484   std::reverse(FunctionSignatureList.begin(), FunctionSignatureList.end());
485
486   // This is for future proofing... in the future extra fields may be added that
487   // we don't understand, so we transparently ignore them.
488   //
489   Buf = End;
490   return false;
491 }
492
493 bool BytecodeParser::ParseModule(const uchar *Buf, const uchar *EndBuf) {
494   unsigned Type, Size;
495   if (readBlock(Buf, EndBuf, Type, Size)) return true;
496   if (Type != BytecodeFormat::Module || Buf+Size != EndBuf) {
497     Error = "Expected Module packet!";
498     return true;                      // Hrm, not a class?
499   }
500
501   BCR_TRACE(0, "BLOCK BytecodeFormat::Module: {\n");
502   FunctionSignatureList.clear();                 // Just in case...
503
504   // Read into instance variables...
505   if (read_vbr(Buf, EndBuf, FirstDerivedTyID)) return true;
506   if (align32(Buf, EndBuf)) return true;
507   BCR_TRACE(1, "FirstDerivedTyID = " << FirstDerivedTyID << "\n");
508
509   while (Buf < EndBuf) {
510     const unsigned char *OldBuf = Buf;
511     if (readBlock(Buf, EndBuf, Type, Size)) return true;
512     switch (Type) {
513     case BytecodeFormat::ConstantPool:
514       BCR_TRACE(1, "BLOCK BytecodeFormat::ConstantPool: {\n");
515       if (ParseConstantPool(Buf, Buf+Size, ModuleValues, ModuleTypeValues))
516         return true;
517       break;
518
519     case BytecodeFormat::ModuleGlobalInfo:
520       BCR_TRACE(1, "BLOCK BytecodeFormat::ModuleGlobalInfo: {\n");
521       if (ParseModuleGlobalInfo(Buf, Buf+Size)) return true;
522       break;
523
524     case BytecodeFormat::Function: {
525       BCR_TRACE(1, "BLOCK BytecodeFormat::Function: {\n");
526       if (ParseFunction(Buf, Buf+Size)) return true;  // Error parsing function
527       break;
528     }
529
530     case BytecodeFormat::SymbolTable:
531       BCR_TRACE(1, "BLOCK BytecodeFormat::SymbolTable: {\n");
532       if (ParseSymbolTable(Buf, Buf+Size, &TheModule->getSymbolTable()))
533         return true;
534       break;
535
536     default:
537       Error = "Expected Module Block!";
538       Buf += Size;
539       if (OldBuf > Buf) return true; // Wrap around!
540       break;
541     }
542     BCR_TRACE(1, "} end block\n");
543     if (align32(Buf, EndBuf)) return true;
544   }
545
546   if (!FunctionSignatureList.empty()) {     // Expected more functions!
547     Error = "Function expected, but bytecode stream at end!";
548     return true;
549   }
550
551   BCR_TRACE(0, "} end block\n\n");
552   return false;
553 }
554
555 static inline Module *Error(std::string *ErrorStr, const char *Message) {
556   if (ErrorStr) *ErrorStr = Message;
557   return 0;
558 }
559
560 Module *BytecodeParser::ParseBytecode(const uchar *Buf, const uchar *EndBuf) {
561   LateResolveValues.clear();
562   unsigned Sig;
563   // Read and check signature...
564   if (read(Buf, EndBuf, Sig) ||
565       Sig != ('l' | ('l' << 8) | ('v' << 16) | 'm' << 24))
566     return ::Error(&Error, "Invalid bytecode signature!");
567
568   TheModule = new Module();
569   if (ParseModule(Buf, EndBuf)) {
570     delete TheModule;
571     TheModule = 0;
572   }
573   return TheModule;
574 }
575
576
577 Module *ParseBytecodeBuffer(const unsigned char *Buffer, unsigned Length,
578                             std::string *ErrorStr) {
579   BytecodeParser Parser;
580   Module *R = Parser.ParseBytecode(Buffer, Buffer+Length);
581   if (ErrorStr) *ErrorStr = Parser.getError();
582   return R;
583 }
584
585
586 /// FDHandle - Simple handle class to make sure a file descriptor gets closed
587 /// when the object is destroyed.
588 class FDHandle {
589   int FD;
590 public:
591   FDHandle(int fd) : FD(fd) {}
592   operator int() const { return FD; }
593   ~FDHandle() {
594     if (FD != -1) close(FD);
595   }
596 };
597
598 // Parse and return a class file...
599 //
600 Module *ParseBytecodeFile(const std::string &Filename, std::string *ErrorStr) {
601   Module *Result = 0;
602
603   if (Filename != std::string("-")) {        // Read from a file...
604     FDHandle FD = open(Filename.c_str(), O_RDONLY);
605     if (FD == -1)
606       return Error(ErrorStr, "Error opening file!");
607
608     // Stat the file to get its length...
609     struct stat StatBuf;
610     if (fstat(FD, &StatBuf) == -1 || StatBuf.st_size == 0)
611       return Error(ErrorStr, "Error stat'ing file!");
612
613     // mmap in the file all at once...
614     int Length = StatBuf.st_size;
615     unsigned char *Buffer = (unsigned char*)mmap(0, Length, PROT_READ, 
616                                                  MAP_PRIVATE, FD, 0);
617     if (Buffer == (unsigned char*)MAP_FAILED)
618       return Error(ErrorStr, "Error mmapping file!");
619
620     // Parse the bytecode we mmapped in
621     Result = ParseBytecodeBuffer(Buffer, Length, ErrorStr);
622
623     // Unmmap the bytecode...
624     munmap((char*)Buffer, Length);
625   } else {                              // Read from stdin
626     int BlockSize;
627     uchar Buffer[4096*4];
628     std::vector<unsigned char> FileData;
629
630     // Read in all of the data from stdin, we cannot mmap stdin...
631     while ((BlockSize = read(0 /*stdin*/, Buffer, 4096*4))) {
632       if (BlockSize == -1)
633         return Error(ErrorStr, "Error reading from stdin!");
634
635       FileData.insert(FileData.end(), Buffer, Buffer+BlockSize);
636     }
637
638     if (FileData.empty())
639       return Error(ErrorStr, "Standard Input empty!");
640
641 #define ALIGN_PTRS 0
642 #if ALIGN_PTRS
643     uchar *Buf = (uchar*)mmap(0, FileData.size(), PROT_READ|PROT_WRITE, 
644                               MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
645     assert((Buf != (uchar*)-1) && "mmap returned error!");
646     memcpy(Buf, &FileData[0], FileData.size());
647 #else
648     unsigned char *Buf = &FileData[0];
649 #endif
650
651     Result = ParseBytecodeBuffer(Buf, FileData.size(), ErrorStr);
652
653 #if ALIGN_PTRS
654     munmap((char*)Buf, FileData.size());   // Free mmap'd data area
655 #endif
656   }
657
658   return Result;
659 }