mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
Begin adding experimental support for preserving use-list ordering of bitcode
files. First, add a new block USELIST_BLOCK to the bitcode format. This is where USELIST_CODE_ENTRYs will be stored. The format of the USELIST_CODE_ENTRYs have not yet been defined. Add support in the BitcodeReader for parsing the USELIST_BLOCK. Part of rdar://9860654 and PR5680. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146078 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e77ae2d692
commit
cbbb09687f
@ -41,7 +41,9 @@ namespace bitc {
|
||||
METADATA_BLOCK_ID,
|
||||
METADATA_ATTACHMENT_ID,
|
||||
|
||||
TYPE_BLOCK_ID_NEW
|
||||
TYPE_BLOCK_ID_NEW,
|
||||
|
||||
USELIST_BLOCK_ID
|
||||
};
|
||||
|
||||
|
||||
@ -311,6 +313,10 @@ namespace bitc {
|
||||
FUNC_CODE_INST_STOREATOMIC = 42 // STORE: [ptrty,ptr,val, align, vol
|
||||
// ordering, synchscope]
|
||||
};
|
||||
|
||||
enum UseListCodes {
|
||||
USELIST_CODE_ENTRY = 1 // USELIST_CODE_ENTRY: TBD.
|
||||
};
|
||||
} // End bitc namespace
|
||||
} // End llvm namespace
|
||||
|
||||
|
@ -1287,6 +1287,50 @@ bool BitcodeReader::ParseConstants() {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool BitcodeReader::ParseUseLists() {
|
||||
if (Stream.EnterSubBlock(bitc::USELIST_BLOCK_ID))
|
||||
return Error("Malformed block record");
|
||||
|
||||
SmallVector<uint64_t, 64> Record;
|
||||
|
||||
// Read all the records.
|
||||
while (1) {
|
||||
unsigned Code = Stream.ReadCode();
|
||||
if (Code == bitc::END_BLOCK) {
|
||||
if (Stream.ReadBlockEnd())
|
||||
return Error("Error at end of use-list table block");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Code == bitc::ENTER_SUBBLOCK) {
|
||||
// No known subblocks, always skip them.
|
||||
Stream.ReadSubBlockID();
|
||||
if (Stream.SkipBlock())
|
||||
return Error("Malformed block record");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Code == bitc::DEFINE_ABBREV) {
|
||||
Stream.ReadAbbrevRecord();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Read a use list record.
|
||||
Record.clear();
|
||||
switch (Stream.ReadRecord(Code, Record)) {
|
||||
default: // Default behavior: unknown type.
|
||||
break;
|
||||
case bitc::USELIST_CODE_ENTRY: { // USELIST_CODE_ENTRY: TBD.
|
||||
unsigned RecordLength = Record.size();
|
||||
if (RecordLength < 1)
|
||||
return Error ("Invalid UseList reader!");
|
||||
UseListRecords.push_back(Record);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// RememberAndSkipFunctionBody - When we see the block for a function body,
|
||||
/// remember where it is and then skip it. This lets us lazily deserialize the
|
||||
/// functions.
|
||||
@ -1393,6 +1437,10 @@ bool BitcodeReader::ParseModule() {
|
||||
if (RememberAndSkipFunctionBody())
|
||||
return true;
|
||||
break;
|
||||
case bitc::USELIST_BLOCK_ID:
|
||||
if (ParseUseLists())
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -2746,6 +2794,9 @@ Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context,
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: Restore the use-lists to the in-memory state when the bitcode was
|
||||
// written. We must defer until the Module has been fully materialized.
|
||||
|
||||
return M;
|
||||
}
|
||||
|
||||
|
@ -135,6 +135,7 @@ class BitcodeReader : public GVMaterializer {
|
||||
BitcodeReaderValueList ValueList;
|
||||
BitcodeReaderMDValueList MDValueList;
|
||||
SmallVector<Instruction *, 64> InstructionList;
|
||||
SmallVector<SmallVector<uint64_t, 64>, 64> UseListRecords;
|
||||
|
||||
std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits;
|
||||
std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits;
|
||||
@ -268,6 +269,7 @@ private:
|
||||
bool ParseMetadata();
|
||||
bool ParseMetadataAttachment();
|
||||
bool ParseModuleTriple(std::string &Triple);
|
||||
bool ParseUseLists();
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/Operator.h"
|
||||
#include "llvm/ValueSymbolTable.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -31,6 +32,12 @@
|
||||
#include <map>
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<bool>
|
||||
EnablePreserveUseListOrdering("enable-bc-uselist-preserve",
|
||||
cl::desc("Turn on experimental support for "
|
||||
"use-list order preservation."),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
/// These are manifest constants used by the bitcode writer. They do not need to
|
||||
/// be kept in sync with the reader, but need to be consistent within this file.
|
||||
enum {
|
||||
@ -1571,6 +1578,20 @@ static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) {
|
||||
Stream.ExitBlock();
|
||||
}
|
||||
|
||||
// Emit use-lists.
|
||||
static void WriteModuleUseLists(const Module *M, ValueEnumerator &VE,
|
||||
BitstreamWriter &Stream) {
|
||||
Stream.EnterSubblock(bitc::USELIST_BLOCK_ID, 3);
|
||||
|
||||
// Emit a bogus record for testing purposes.
|
||||
SmallVector<uint64_t, 64> Record;
|
||||
Record.push_back(0);
|
||||
Stream.EmitRecord(bitc::USELIST_CODE_ENTRY, Record);
|
||||
|
||||
// TODO: Tons.
|
||||
|
||||
Stream.ExitBlock();
|
||||
}
|
||||
|
||||
/// WriteModule - Emit the specified module to the bitstream.
|
||||
static void WriteModule(const Module *M, BitstreamWriter &Stream) {
|
||||
@ -1616,6 +1637,10 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) {
|
||||
// Emit names for globals/functions etc.
|
||||
WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream);
|
||||
|
||||
// Emit use-lists.
|
||||
if (EnablePreserveUseListOrdering)
|
||||
WriteModuleUseLists(M, VE, Stream);
|
||||
|
||||
Stream.ExitBlock();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user