BitcodeWriter.cpp (198892) | BitcodeWriter.cpp (201360) |
---|---|
1//===--- Bitcode/Writer/BitcodeWriter.cpp - Bitcode Writer ----------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 5 unchanged lines hidden (view full) --- 14#include "llvm/Bitcode/ReaderWriter.h" 15#include "llvm/Bitcode/BitstreamWriter.h" 16#include "llvm/Bitcode/LLVMBitCodes.h" 17#include "ValueEnumerator.h" 18#include "llvm/Constants.h" 19#include "llvm/DerivedTypes.h" 20#include "llvm/InlineAsm.h" 21#include "llvm/Instructions.h" | 1//===--- Bitcode/Writer/BitcodeWriter.cpp - Bitcode Writer ----------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 5 unchanged lines hidden (view full) --- 14#include "llvm/Bitcode/ReaderWriter.h" 15#include "llvm/Bitcode/BitstreamWriter.h" 16#include "llvm/Bitcode/LLVMBitCodes.h" 17#include "ValueEnumerator.h" 18#include "llvm/Constants.h" 19#include "llvm/DerivedTypes.h" 20#include "llvm/InlineAsm.h" 21#include "llvm/Instructions.h" |
22#include "llvm/LLVMContext.h" 23#include "llvm/Metadata.h" | |
24#include "llvm/Module.h" 25#include "llvm/Operator.h" 26#include "llvm/TypeSymbolTable.h" 27#include "llvm/ValueSymbolTable.h" 28#include "llvm/Support/ErrorHandling.h" 29#include "llvm/Support/MathExtras.h" 30#include "llvm/Support/raw_ostream.h" 31#include "llvm/System/Program.h" --- 440 unchanged lines hidden (view full) --- 472 473 return Flags; 474} 475 476static void WriteMDNode(const MDNode *N, 477 const ValueEnumerator &VE, 478 BitstreamWriter &Stream, 479 SmallVector<uint64_t, 64> &Record) { | 22#include "llvm/Module.h" 23#include "llvm/Operator.h" 24#include "llvm/TypeSymbolTable.h" 25#include "llvm/ValueSymbolTable.h" 26#include "llvm/Support/ErrorHandling.h" 27#include "llvm/Support/MathExtras.h" 28#include "llvm/Support/raw_ostream.h" 29#include "llvm/System/Program.h" --- 440 unchanged lines hidden (view full) --- 470 471 return Flags; 472} 473 474static void WriteMDNode(const MDNode *N, 475 const ValueEnumerator &VE, 476 BitstreamWriter &Stream, 477 SmallVector<uint64_t, 64> &Record) { |
480 for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) { 481 if (N->getElement(i)) { 482 Record.push_back(VE.getTypeID(N->getElement(i)->getType())); 483 Record.push_back(VE.getValueID(N->getElement(i))); | 478 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 479 if (N->getOperand(i)) { 480 Record.push_back(VE.getTypeID(N->getOperand(i)->getType())); 481 Record.push_back(VE.getValueID(N->getOperand(i))); |
484 } else { 485 Record.push_back(VE.getTypeID(Type::getVoidTy(N->getContext()))); 486 Record.push_back(0); 487 } 488 } 489 Stream.EmitRecord(bitc::METADATA_NODE, Record, 0); 490 Record.clear(); 491} --- 40 unchanged lines hidden (view full) --- 532 // Write name. 533 std::string Str = NMD->getNameStr(); 534 const char *StrBegin = Str.c_str(); 535 for (unsigned i = 0, e = Str.length(); i != e; ++i) 536 Record.push_back(StrBegin[i]); 537 Stream.EmitRecord(bitc::METADATA_NAME, Record, 0/*TODO*/); 538 Record.clear(); 539 | 482 } else { 483 Record.push_back(VE.getTypeID(Type::getVoidTy(N->getContext()))); 484 Record.push_back(0); 485 } 486 } 487 Stream.EmitRecord(bitc::METADATA_NODE, Record, 0); 488 Record.clear(); 489} --- 40 unchanged lines hidden (view full) --- 530 // Write name. 531 std::string Str = NMD->getNameStr(); 532 const char *StrBegin = Str.c_str(); 533 for (unsigned i = 0, e = Str.length(); i != e; ++i) 534 Record.push_back(StrBegin[i]); 535 Stream.EmitRecord(bitc::METADATA_NAME, Record, 0/*TODO*/); 536 Record.clear(); 537 |
540 // Write named metadata elements. 541 for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) { 542 if (NMD->getElement(i)) 543 Record.push_back(VE.getValueID(NMD->getElement(i))); | 538 // Write named metadata operands. 539 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 540 if (NMD->getOperand(i)) 541 Record.push_back(VE.getValueID(NMD->getOperand(i))); |
544 else 545 Record.push_back(0); 546 } 547 Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0); 548 Record.clear(); 549 } 550 } 551 --- 4 unchanged lines hidden (view full) --- 556static void WriteMetadataAttachment(const Function &F, 557 const ValueEnumerator &VE, 558 BitstreamWriter &Stream) { 559 bool StartedMetadataBlock = false; 560 SmallVector<uint64_t, 64> Record; 561 562 // Write metadata attachments 563 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] | 542 else 543 Record.push_back(0); 544 } 545 Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0); 546 Record.clear(); 547 } 548 } 549 --- 4 unchanged lines hidden (view full) --- 554static void WriteMetadataAttachment(const Function &F, 555 const ValueEnumerator &VE, 556 BitstreamWriter &Stream) { 557 bool StartedMetadataBlock = false; 558 SmallVector<uint64_t, 64> Record; 559 560 // Write metadata attachments 561 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] |
564 MetadataContext &TheMetadata = F.getContext().getMetadata(); 565 typedef SmallVector<std::pair<unsigned, TrackingVH<MDNode> >, 2> MDMapTy; 566 MDMapTy MDs; | 562 SmallVector<std::pair<unsigned, MDNode*>, 4> MDs; 563 |
567 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 568 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); 569 I != E; ++I) { 570 MDs.clear(); | 564 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 565 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); 566 I != E; ++I) { 567 MDs.clear(); |
571 TheMetadata.getMDs(I, MDs); 572 bool RecordedInstruction = false; 573 for (MDMapTy::const_iterator PI = MDs.begin(), PE = MDs.end(); 574 PI != PE; ++PI) { 575 if (RecordedInstruction == false) { 576 Record.push_back(VE.getInstructionID(I)); 577 RecordedInstruction = true; 578 } 579 Record.push_back(PI->first); 580 Record.push_back(VE.getValueID(PI->second)); | 568 I->getAllMetadata(MDs); 569 570 // If no metadata, ignore instruction. 571 if (MDs.empty()) continue; 572 573 Record.push_back(VE.getInstructionID(I)); 574 575 for (unsigned i = 0, e = MDs.size(); i != e; ++i) { 576 Record.push_back(MDs[i].first); 577 Record.push_back(VE.getValueID(MDs[i].second)); |
581 } | 578 } |
582 if (!Record.empty()) { 583 if (!StartedMetadataBlock) { 584 Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); 585 StartedMetadataBlock = true; 586 } 587 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); 588 Record.clear(); | 579 if (!StartedMetadataBlock) { 580 Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); 581 StartedMetadataBlock = true; |
589 } | 582 } |
583 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); 584 Record.clear(); |
|
590 } 591 592 if (StartedMetadataBlock) 593 Stream.ExitBlock(); 594} 595 | 585 } 586 587 if (StartedMetadataBlock) 588 Stream.ExitBlock(); 589} 590 |
596static void WriteModuleMetadataStore(const Module *M, 597 const ValueEnumerator &VE, 598 BitstreamWriter &Stream) { 599 600 bool StartedMetadataBlock = false; | 591static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) { |
601 SmallVector<uint64_t, 64> Record; 602 603 // Write metadata kinds 604 // METADATA_KIND - [n x [id, name]] | 592 SmallVector<uint64_t, 64> Record; 593 594 // Write metadata kinds 595 // METADATA_KIND - [n x [id, name]] |
605 MetadataContext &TheMetadata = M->getContext().getMetadata(); 606 SmallVector<std::pair<unsigned, StringRef>, 4> Names; 607 TheMetadata.getHandlerNames(Names); 608 for (SmallVector<std::pair<unsigned, StringRef>, 4>::iterator 609 I = Names.begin(), 610 E = Names.end(); I != E; ++I) { 611 Record.push_back(I->first); 612 StringRef KName = I->second; 613 for (unsigned i = 0, e = KName.size(); i != e; ++i) 614 Record.push_back(KName[i]); 615 if (!StartedMetadataBlock) { 616 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); 617 StartedMetadataBlock = true; 618 } | 596 SmallVector<StringRef, 4> Names; 597 M->getMDKindNames(Names); 598 599 assert(Names[0] == "" && "MDKind #0 is invalid"); 600 if (Names.size() == 1) return; 601 602 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); 603 604 for (unsigned MDKindID = 1, e = Names.size(); MDKindID != e; ++MDKindID) { 605 Record.push_back(MDKindID); 606 StringRef KName = Names[MDKindID]; 607 Record.append(KName.begin(), KName.end()); 608 |
619 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); 620 Record.clear(); 621 } 622 | 609 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); 610 Record.clear(); 611 } 612 |
623 if (StartedMetadataBlock) 624 Stream.ExitBlock(); | 613 Stream.ExitBlock(); |
625} 626 627static void WriteConstants(unsigned FirstVal, unsigned LastVal, 628 const ValueEnumerator &VE, 629 BitstreamWriter &Stream, bool isGlobal) { 630 if (FirstVal == LastVal) return; 631 632 Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4); --- 575 unchanged lines hidden (view full) --- 1208 // Keep a running idea of what the instruction ID is. 1209 unsigned InstID = CstEnd; 1210 1211 // Finally, emit all the instructions, in order. 1212 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 1213 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); 1214 I != E; ++I) { 1215 WriteInstruction(*I, InstID, VE, Stream, Vals); | 614} 615 616static void WriteConstants(unsigned FirstVal, unsigned LastVal, 617 const ValueEnumerator &VE, 618 BitstreamWriter &Stream, bool isGlobal) { 619 if (FirstVal == LastVal) return; 620 621 Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4); --- 575 unchanged lines hidden (view full) --- 1197 // Keep a running idea of what the instruction ID is. 1198 unsigned InstID = CstEnd; 1199 1200 // Finally, emit all the instructions, in order. 1201 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 1202 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); 1203 I != E; ++I) { 1204 WriteInstruction(*I, InstID, VE, Stream, Vals); |
1216 if (I->getType() != Type::getVoidTy(F.getContext())) | 1205 if (!I->getType()->isVoidTy()) |
1217 ++InstID; 1218 } 1219 1220 // Emit names for all the instructions etc. 1221 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); 1222 1223 WriteMetadataAttachment(F, VE, Stream); 1224 VE.purgeFunction(); --- 236 unchanged lines hidden (view full) --- 1461 WriteModuleMetadata(VE, Stream); 1462 1463 // Emit function bodies. 1464 for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) 1465 if (!I->isDeclaration()) 1466 WriteFunction(*I, VE, Stream); 1467 1468 // Emit metadata. | 1206 ++InstID; 1207 } 1208 1209 // Emit names for all the instructions etc. 1210 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); 1211 1212 WriteMetadataAttachment(F, VE, Stream); 1213 VE.purgeFunction(); --- 236 unchanged lines hidden (view full) --- 1450 WriteModuleMetadata(VE, Stream); 1451 1452 // Emit function bodies. 1453 for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) 1454 if (!I->isDeclaration()) 1455 WriteFunction(*I, VE, Stream); 1456 1457 // Emit metadata. |
1469 WriteModuleMetadataStore(M, VE, Stream); | 1458 WriteModuleMetadataStore(M, Stream); |
1470 1471 // Emit the type symbol table information. 1472 WriteTypeSymbolTable(M->getTypeSymbolTable(), VE, Stream); 1473 1474 // Emit names for globals/functions etc. 1475 WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream); 1476 1477 Stream.ExitBlock(); --- 110 unchanged lines hidden --- | 1459 1460 // Emit the type symbol table information. 1461 WriteTypeSymbolTable(M->getTypeSymbolTable(), VE, Stream); 1462 1463 // Emit names for globals/functions etc. 1464 WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream); 1465 1466 Stream.ExitBlock(); --- 110 unchanged lines hidden --- |