Deleted Added
sdiff udiff text old ( 198892 ) new ( 201360 )
full compact
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/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) {
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)));
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
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)));
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]]]
562 SmallVector<std::pair<unsigned, MDNode*>, 4> MDs;
563
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();
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));
578 }
579 if (!StartedMetadataBlock) {
580 Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3);
581 StartedMetadataBlock = true;
582 }
583 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
584 Record.clear();
585 }
586
587 if (StartedMetadataBlock)
588 Stream.ExitBlock();
589}
590
591static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) {
592 SmallVector<uint64_t, 64> Record;
593
594 // Write metadata kinds
595 // METADATA_KIND - [n x [id, name]]
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
609 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0);
610 Record.clear();
611 }
612
613 Stream.ExitBlock();
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);
1205 if (!I->getType()->isVoidTy())
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.
1458 WriteModuleMetadataStore(M, Stream);
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 ---