|
@@ -94,35 +94,35 @@ public:
|
|
|
void resolveConstantForwardRefs();
|
|
|
};
|
|
|
|
|
|
-class BitcodeReaderMDValueList {
|
|
|
+class BitcodeReaderMetadataList {
|
|
|
unsigned NumFwdRefs;
|
|
|
bool AnyFwdRefs;
|
|
|
unsigned MinFwdRef;
|
|
|
unsigned MaxFwdRef;
|
|
|
- std::vector<TrackingMDRef> MDValuePtrs;
|
|
|
+ std::vector<TrackingMDRef> MetadataPtrs;
|
|
|
|
|
|
LLVMContext &Context;
|
|
|
public:
|
|
|
- BitcodeReaderMDValueList(LLVMContext &C)
|
|
|
+ BitcodeReaderMetadataList(LLVMContext &C)
|
|
|
: NumFwdRefs(0), AnyFwdRefs(false), Context(C) {}
|
|
|
|
|
|
// vector compatibility methods
|
|
|
- unsigned size() const { return MDValuePtrs.size(); }
|
|
|
- void resize(unsigned N) { MDValuePtrs.resize(N); }
|
|
|
- void push_back(Metadata *MD) { MDValuePtrs.emplace_back(MD); }
|
|
|
- void clear() { MDValuePtrs.clear(); }
|
|
|
- Metadata *back() const { return MDValuePtrs.back(); }
|
|
|
- void pop_back() { MDValuePtrs.pop_back(); }
|
|
|
- bool empty() const { return MDValuePtrs.empty(); }
|
|
|
+ unsigned size() const { return MetadataPtrs.size(); }
|
|
|
+ void resize(unsigned N) { MetadataPtrs.resize(N); }
|
|
|
+ void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
|
|
|
+ void clear() { MetadataPtrs.clear(); }
|
|
|
+ Metadata *back() const { return MetadataPtrs.back(); }
|
|
|
+ void pop_back() { MetadataPtrs.pop_back(); }
|
|
|
+ bool empty() const { return MetadataPtrs.empty(); }
|
|
|
|
|
|
Metadata *operator[](unsigned i) const {
|
|
|
- assert(i < MDValuePtrs.size());
|
|
|
- return MDValuePtrs[i];
|
|
|
+ assert(i < MetadataPtrs.size());
|
|
|
+ return MetadataPtrs[i];
|
|
|
}
|
|
|
|
|
|
void shrinkTo(unsigned N) {
|
|
|
assert(N <= size() && "Invalid shrinkTo request!");
|
|
|
- MDValuePtrs.resize(N);
|
|
|
+ MetadataPtrs.resize(N);
|
|
|
}
|
|
|
|
|
|
Metadata *getValueFwdRef(unsigned Idx);
|
|
@@ -152,7 +152,7 @@ class BitcodeReader : public GVMaterializer {
|
|
|
|
|
|
std::vector<Type*> TypeList;
|
|
|
BitcodeReaderValueList ValueList;
|
|
|
- BitcodeReaderMDValueList MDValueList;
|
|
|
+ BitcodeReaderMetadataList MetadataList;
|
|
|
std::vector<Comdat *> ComdatList;
|
|
|
SmallVector<Instruction *, 64> InstructionList;
|
|
|
|
|
@@ -270,12 +270,12 @@ public:
|
|
|
void setStripDebugInfo() override;
|
|
|
|
|
|
/// Save the mapping between the metadata values and the corresponding
|
|
|
- /// value id that were recorded in the MDValueList during parsing. If
|
|
|
+ /// value id that were recorded in the MetadataList during parsing. If
|
|
|
/// OnlyTempMD is true, then only record those entries that are still
|
|
|
/// temporary metadata. This interface is used when metadata linking is
|
|
|
/// performed as a postpass, such as during function importing.
|
|
|
- void saveMDValueList(DenseMap<const Metadata *, unsigned> &MDValueToValIDMap,
|
|
|
- bool OnlyTempMD) override;
|
|
|
+ void saveMetadataList(DenseMap<const Metadata *, unsigned> &MetadataToIDs,
|
|
|
+ bool OnlyTempMD) override;
|
|
|
|
|
|
private:
|
|
|
/// Parse the "IDENTIFICATION_BLOCK_ID" block, populate the
|
|
@@ -294,7 +294,7 @@ private:
|
|
|
return ValueList.getValueFwdRef(ID, Ty);
|
|
|
}
|
|
|
Metadata *getFnMetadataByID(unsigned ID) {
|
|
|
- return MDValueList.getValueFwdRef(ID);
|
|
|
+ return MetadataList.getValueFwdRef(ID);
|
|
|
}
|
|
|
BasicBlock *getBasicBlock(unsigned ID) const {
|
|
|
if (ID >= FunctionBBs.size()) return nullptr; // Invalid ID
|
|
@@ -558,11 +558,11 @@ std::error_code BitcodeReader::error(BitcodeError E) {
|
|
|
|
|
|
BitcodeReader::BitcodeReader(MemoryBuffer *Buffer, LLVMContext &Context)
|
|
|
: Context(Context), Buffer(Buffer), ValueList(Context),
|
|
|
- MDValueList(Context) {}
|
|
|
+ MetadataList(Context) {}
|
|
|
|
|
|
BitcodeReader::BitcodeReader(LLVMContext &Context)
|
|
|
: Context(Context), Buffer(nullptr), ValueList(Context),
|
|
|
- MDValueList(Context) {}
|
|
|
+ MetadataList(Context) {}
|
|
|
|
|
|
std::error_code BitcodeReader::materializeForwardReferencedFunctions() {
|
|
|
if (WillMaterializeAllForwardRefs)
|
|
@@ -601,7 +601,7 @@ void BitcodeReader::freeState() {
|
|
|
Buffer = nullptr;
|
|
|
std::vector<Type*>().swap(TypeList);
|
|
|
ValueList.clear();
|
|
|
- MDValueList.clear();
|
|
|
+ MetadataList.clear();
|
|
|
std::vector<Comdat *>().swap(ComdatList);
|
|
|
|
|
|
std::vector<AttributeSet>().swap(MAttributes);
|
|
@@ -1035,7 +1035,7 @@ void BitcodeReaderValueList::resolveConstantForwardRefs() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void BitcodeReaderMDValueList::assignValue(Metadata *MD, unsigned Idx) {
|
|
|
+void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
|
|
|
if (Idx == size()) {
|
|
|
push_back(MD);
|
|
|
return;
|
|
@@ -1044,7 +1044,7 @@ void BitcodeReaderMDValueList::assignValue(Metadata *MD, unsigned Idx) {
|
|
|
if (Idx >= size())
|
|
|
resize(Idx+1);
|
|
|
|
|
|
- TrackingMDRef &OldMD = MDValuePtrs[Idx];
|
|
|
+ TrackingMDRef &OldMD = MetadataPtrs[Idx];
|
|
|
if (!OldMD) {
|
|
|
OldMD.reset(MD);
|
|
|
return;
|
|
@@ -1056,11 +1056,11 @@ void BitcodeReaderMDValueList::assignValue(Metadata *MD, unsigned Idx) {
|
|
|
--NumFwdRefs;
|
|
|
}
|
|
|
|
|
|
-Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {
|
|
|
+Metadata *BitcodeReaderMetadataList::getValueFwdRef(unsigned Idx) {
|
|
|
if (Idx >= size())
|
|
|
resize(Idx + 1);
|
|
|
|
|
|
- if (Metadata *MD = MDValuePtrs[Idx])
|
|
|
+ if (Metadata *MD = MetadataPtrs[Idx])
|
|
|
return MD;
|
|
|
|
|
|
// Track forward refs to be resolved later.
|
|
@@ -1075,11 +1075,11 @@ Metadata *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {
|
|
|
|
|
|
// Create and return a placeholder, which will later be RAUW'd.
|
|
|
Metadata *MD = MDNode::getTemporary(Context, None).release();
|
|
|
- MDValuePtrs[Idx].reset(MD);
|
|
|
+ MetadataPtrs[Idx].reset(MD);
|
|
|
return MD;
|
|
|
}
|
|
|
|
|
|
-void BitcodeReaderMDValueList::tryToResolveCycles() {
|
|
|
+void BitcodeReaderMetadataList::tryToResolveCycles() {
|
|
|
if (!AnyFwdRefs)
|
|
|
// Nothing to do.
|
|
|
return;
|
|
@@ -1090,7 +1090,7 @@ void BitcodeReaderMDValueList::tryToResolveCycles() {
|
|
|
|
|
|
// Resolve any cycles.
|
|
|
for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) {
|
|
|
- auto &MD = MDValuePtrs[I];
|
|
|
+ auto &MD = MetadataPtrs[I];
|
|
|
auto *N = dyn_cast_or_null<MDNode>(MD);
|
|
|
if (!N)
|
|
|
continue;
|
|
@@ -1867,20 +1867,20 @@ static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; }
|
|
|
/// module level metadata.
|
|
|
std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
IsMetadataMaterialized = true;
|
|
|
- unsigned NextMDValueNo = MDValueList.size();
|
|
|
+ unsigned NextMetadataNo = MetadataList.size();
|
|
|
if (ModuleLevel && SeenModuleValuesRecord) {
|
|
|
// Now that we are parsing the module level metadata, we want to restart
|
|
|
// the numbering of the MD values, and replace temp MD created earlier
|
|
|
// with their real values. If we saw a METADATA_VALUE record then we
|
|
|
- // would have set the MDValueList size to the number specified in that
|
|
|
+ // would have set the MetadataList size to the number specified in that
|
|
|
// record, to support parsing function-level metadata first, and we need
|
|
|
- // to reset back to 0 to fill the MDValueList in with the parsed module
|
|
|
- // The function-level metadata parsing should have reset the MDValueList
|
|
|
+ // to reset back to 0 to fill the MetadataList in with the parsed module
|
|
|
+ // The function-level metadata parsing should have reset the MetadataList
|
|
|
// size back to the value reported by the METADATA_VALUE record, saved in
|
|
|
// NumModuleMDs.
|
|
|
- assert(NumModuleMDs == MDValueList.size() &&
|
|
|
- "Expected MDValueList to only contain module level values");
|
|
|
- NextMDValueNo = 0;
|
|
|
+ assert(NumModuleMDs == MetadataList.size() &&
|
|
|
+ "Expected MetadataList to only contain module level values");
|
|
|
+ NextMetadataNo = 0;
|
|
|
}
|
|
|
|
|
|
if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
|
|
@@ -1888,8 +1888,9 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
|
|
|
SmallVector<uint64_t, 64> Record;
|
|
|
|
|
|
- auto getMD =
|
|
|
- [&](unsigned ID) -> Metadata *{ return MDValueList.getValueFwdRef(ID); };
|
|
|
+ auto getMD = [&](unsigned ID) -> Metadata * {
|
|
|
+ return MetadataList.getValueFwdRef(ID);
|
|
|
+ };
|
|
|
auto getMDOrNull = [&](unsigned ID) -> Metadata *{
|
|
|
if (ID)
|
|
|
return getMD(ID - 1);
|
|
@@ -1913,9 +1914,9 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
case BitstreamEntry::Error:
|
|
|
return error("Malformed block");
|
|
|
case BitstreamEntry::EndBlock:
|
|
|
- MDValueList.tryToResolveCycles();
|
|
|
+ MetadataList.tryToResolveCycles();
|
|
|
assert((!(ModuleLevel && SeenModuleValuesRecord) ||
|
|
|
- NumModuleMDs == MDValueList.size()) &&
|
|
|
+ NumModuleMDs == MetadataList.size()) &&
|
|
|
"Inconsistent bitcode: METADATA_VALUES mismatch");
|
|
|
return std::error_code();
|
|
|
case BitstreamEntry::Record:
|
|
@@ -1944,7 +1945,8 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
unsigned Size = Record.size();
|
|
|
NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name);
|
|
|
for (unsigned i = 0; i != Size; ++i) {
|
|
|
- MDNode *MD = dyn_cast_or_null<MDNode>(MDValueList.getValueFwdRef(Record[i]));
|
|
|
+ MDNode *MD =
|
|
|
+ dyn_cast_or_null<MDNode>(MetadataList.getValueFwdRef(Record[i]));
|
|
|
if (!MD)
|
|
|
return error("Invalid record");
|
|
|
NMD->addOperand(MD);
|
|
@@ -1961,7 +1963,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
// If this isn't a LocalAsMetadata record, we're dropping it. This used
|
|
|
// to be legal, but there's no upgrade path.
|
|
|
auto dropRecord = [&] {
|
|
|
- MDValueList.assignValue(MDNode::get(Context, None), NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo++);
|
|
|
};
|
|
|
if (Record.size() != 2) {
|
|
|
dropRecord();
|
|
@@ -1974,9 +1976,9 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_OLD_NODE: {
|
|
@@ -1991,7 +1993,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
if (!Ty)
|
|
|
return error("Invalid record");
|
|
|
if (Ty->isMetadataTy())
|
|
|
- Elts.push_back(MDValueList.getValueFwdRef(Record[i+1]));
|
|
|
+ Elts.push_back(MetadataList.getValueFwdRef(Record[i + 1]));
|
|
|
else if (!Ty->isVoidTy()) {
|
|
|
auto *MD =
|
|
|
ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
|
|
@@ -2001,7 +2003,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
} else
|
|
|
Elts.push_back(nullptr);
|
|
|
}
|
|
|
- MDValueList.assignValue(MDNode::get(Context, Elts), NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_VALUE: {
|
|
@@ -2012,9 +2014,9 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
if (Ty->isMetadataTy() || Ty->isVoidTy())
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_DISTINCT_NODE:
|
|
@@ -2024,10 +2026,10 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
SmallVector<Metadata *, 8> Elts;
|
|
|
Elts.reserve(Record.size());
|
|
|
for (unsigned ID : Record)
|
|
|
- Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr);
|
|
|
- MDValueList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
|
|
|
- : MDNode::get(Context, Elts),
|
|
|
- NextMDValueNo++);
|
|
|
+ Elts.push_back(ID ? MetadataList.getValueFwdRef(ID - 1) : nullptr);
|
|
|
+ MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
|
|
|
+ : MDNode::get(Context, Elts),
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_LOCATION: {
|
|
@@ -2036,13 +2038,13 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
|
|
|
unsigned Line = Record[1];
|
|
|
unsigned Column = Record[2];
|
|
|
- MDNode *Scope = cast<MDNode>(MDValueList.getValueFwdRef(Record[3]));
|
|
|
+ MDNode *Scope = cast<MDNode>(MetadataList.getValueFwdRef(Record[3]));
|
|
|
Metadata *InlinedAt =
|
|
|
- Record[4] ? MDValueList.getValueFwdRef(Record[4] - 1) : nullptr;
|
|
|
- MDValueList.assignValue(
|
|
|
+ Record[4] ? MetadataList.getValueFwdRef(Record[4] - 1) : nullptr;
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DILocation, Record[0],
|
|
|
(Context, Line, Column, Scope, InlinedAt)),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_GENERIC_DEBUG: {
|
|
@@ -2058,63 +2060,65 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
auto *Header = getMDString(Record[3]);
|
|
|
SmallVector<Metadata *, 8> DwarfOps;
|
|
|
for (unsigned I = 4, E = Record.size(); I != E; ++I)
|
|
|
- DwarfOps.push_back(Record[I] ? MDValueList.getValueFwdRef(Record[I] - 1)
|
|
|
- : nullptr);
|
|
|
- MDValueList.assignValue(GET_OR_DISTINCT(GenericDINode, Record[0],
|
|
|
- (Context, Tag, Header, DwarfOps)),
|
|
|
- NextMDValueNo++);
|
|
|
+ DwarfOps.push_back(
|
|
|
+ Record[I] ? MetadataList.getValueFwdRef(Record[I] - 1) : nullptr);
|
|
|
+ MetadataList.assignValue(
|
|
|
+ GET_OR_DISTINCT(GenericDINode, Record[0],
|
|
|
+ (Context, Tag, Header, DwarfOps)),
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_SUBRANGE: {
|
|
|
if (Record.size() != 3)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DISubrange, Record[0],
|
|
|
(Context, Record[1], unrotateSign(Record[2]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_ENUMERATOR: {
|
|
|
if (Record.size() != 3)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(GET_OR_DISTINCT(DIEnumerator, Record[0],
|
|
|
- (Context, unrotateSign(Record[1]),
|
|
|
- getMDString(Record[2]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(
|
|
|
+ GET_OR_DISTINCT(
|
|
|
+ DIEnumerator, Record[0],
|
|
|
+ (Context, unrotateSign(Record[1]), getMDString(Record[2]))),
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_BASIC_TYPE: {
|
|
|
if (Record.size() != 6)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIBasicType, Record[0],
|
|
|
(Context, Record[1], getMDString(Record[2]),
|
|
|
Record[3], Record[4], Record[5])),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_DERIVED_TYPE: {
|
|
|
if (Record.size() != 12)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIDerivedType, Record[0],
|
|
|
(Context, Record[1], getMDString(Record[2]),
|
|
|
getMDOrNull(Record[3]), Record[4],
|
|
|
getMDOrNull(Record[5]), getMDOrNull(Record[6]),
|
|
|
Record[7], Record[8], Record[9], Record[10],
|
|
|
getMDOrNull(Record[11]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_COMPOSITE_TYPE: {
|
|
|
if (Record.size() != 16)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DICompositeType, Record[0],
|
|
|
(Context, Record[1], getMDString(Record[2]),
|
|
|
getMDOrNull(Record[3]), Record[4],
|
|
@@ -2123,17 +2127,17 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
getMDOrNull(Record[11]), Record[12],
|
|
|
getMDOrNull(Record[13]), getMDOrNull(Record[14]),
|
|
|
getMDString(Record[15]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_SUBROUTINE_TYPE: {
|
|
|
if (Record.size() != 3)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DISubroutineType, Record[0],
|
|
|
(Context, Record[1], getMDOrNull(Record[2]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -2141,12 +2145,12 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
if (Record.size() != 6)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIModule, Record[0],
|
|
|
(Context, getMDOrNull(Record[1]),
|
|
|
- getMDString(Record[2]), getMDString(Record[3]),
|
|
|
- getMDString(Record[4]), getMDString(Record[5]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ getMDString(Record[2]), getMDString(Record[3]),
|
|
|
+ getMDString(Record[4]), getMDString(Record[5]))),
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -2154,10 +2158,10 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
if (Record.size() != 3)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIFile, Record[0], (Context, getMDString(Record[1]),
|
|
|
getMDString(Record[2]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_COMPILE_UNIT: {
|
|
@@ -2166,7 +2170,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
|
|
|
// Ignore Record[0], which indicates whether this compile unit is
|
|
|
// distinct. It's always distinct.
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
DICompileUnit::getDistinct(
|
|
|
Context, Record[1], getMDOrNull(Record[2]),
|
|
|
getMDString(Record[3]), Record[4], getMDString(Record[5]),
|
|
@@ -2176,7 +2180,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
getMDOrNull(Record[13]),
|
|
|
Record.size() <= 15 ? 0 : getMDOrNull(Record[15]),
|
|
|
Record.size() <= 14 ? 0 : Record[14]),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_SUBPROGRAM: {
|
|
@@ -2193,7 +2197,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
getMDOrNull(Record[10]), Record[11], Record[12], Record[13],
|
|
|
Record[14], getMDOrNull(Record[15 + HasFn]),
|
|
|
getMDOrNull(Record[16 + HasFn]), getMDOrNull(Record[17 + HasFn])));
|
|
|
- MDValueList.assignValue(SP, NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(SP, NextMetadataNo++);
|
|
|
|
|
|
// Upgrade sp->function mapping to function->sp mapping.
|
|
|
if (HasFn && Record[15]) {
|
|
@@ -2213,92 +2217,92 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
if (Record.size() != 5)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DILexicalBlock, Record[0],
|
|
|
(Context, getMDOrNull(Record[1]),
|
|
|
getMDOrNull(Record[2]), Record[3], Record[4])),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_LEXICAL_BLOCK_FILE: {
|
|
|
if (Record.size() != 4)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DILexicalBlockFile, Record[0],
|
|
|
(Context, getMDOrNull(Record[1]),
|
|
|
getMDOrNull(Record[2]), Record[3])),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_NAMESPACE: {
|
|
|
if (Record.size() != 5)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DINamespace, Record[0],
|
|
|
(Context, getMDOrNull(Record[1]),
|
|
|
getMDOrNull(Record[2]), getMDString(Record[3]),
|
|
|
Record[4])),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_MACRO: {
|
|
|
if (Record.size() != 5)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIMacro, Record[0],
|
|
|
(Context, Record[1], Record[2],
|
|
|
getMDString(Record[3]), getMDString(Record[4]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_MACRO_FILE: {
|
|
|
if (Record.size() != 5)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIMacroFile, Record[0],
|
|
|
(Context, Record[1], Record[2],
|
|
|
getMDOrNull(Record[3]), getMDOrNull(Record[4]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_TEMPLATE_TYPE: {
|
|
|
if (Record.size() != 3)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter,
|
|
|
- Record[0],
|
|
|
- (Context, getMDString(Record[1]),
|
|
|
- getMDOrNull(Record[2]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter,
|
|
|
+ Record[0],
|
|
|
+ (Context, getMDString(Record[1]),
|
|
|
+ getMDOrNull(Record[2]))),
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_TEMPLATE_VALUE: {
|
|
|
if (Record.size() != 5)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DITemplateValueParameter, Record[0],
|
|
|
(Context, Record[1], getMDString(Record[2]),
|
|
|
getMDOrNull(Record[3]), getMDOrNull(Record[4]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_GLOBAL_VAR: {
|
|
|
if (Record.size() != 11)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIGlobalVariable, Record[0],
|
|
|
(Context, getMDOrNull(Record[1]),
|
|
|
getMDString(Record[2]), getMDString(Record[3]),
|
|
|
getMDOrNull(Record[4]), Record[5],
|
|
|
getMDOrNull(Record[6]), Record[7], Record[8],
|
|
|
getMDOrNull(Record[9]), getMDOrNull(Record[10]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_LOCAL_VAR: {
|
|
@@ -2309,56 +2313,56 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
|
|
|
// 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
|
|
|
// DW_TAG_arg_variable.
|
|
|
bool HasTag = Record.size() > 8;
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DILocalVariable, Record[0],
|
|
|
(Context, getMDOrNull(Record[1 + HasTag]),
|
|
|
getMDString(Record[2 + HasTag]),
|
|
|
getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
|
|
|
getMDOrNull(Record[5 + HasTag]), Record[6 + HasTag],
|
|
|
Record[7 + HasTag])),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_EXPRESSION: {
|
|
|
if (Record.size() < 1)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIExpression, Record[0],
|
|
|
(Context, makeArrayRef(Record).slice(1))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_OBJC_PROPERTY: {
|
|
|
if (Record.size() != 8)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIObjCProperty, Record[0],
|
|
|
(Context, getMDString(Record[1]),
|
|
|
getMDOrNull(Record[2]), Record[3],
|
|
|
getMDString(Record[4]), getMDString(Record[5]),
|
|
|
Record[6], getMDOrNull(Record[7]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_IMPORTED_ENTITY: {
|
|
|
if (Record.size() != 6)
|
|
|
return error("Invalid record");
|
|
|
|
|
|
- MDValueList.assignValue(
|
|
|
+ MetadataList.assignValue(
|
|
|
GET_OR_DISTINCT(DIImportedEntity, Record[0],
|
|
|
(Context, Record[1], getMDOrNull(Record[2]),
|
|
|
getMDOrNull(Record[3]), Record[4],
|
|
|
getMDString(Record[5]))),
|
|
|
- NextMDValueNo++);
|
|
|
+ NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_STRING: {
|
|
|
std::string String(Record.begin(), Record.end());
|
|
|
llvm::UpgradeMDStringConstant(String);
|
|
|
Metadata *MD = MDString::get(Context, String);
|
|
|
- MDValueList.assignValue(MD, NextMDValueNo++);
|
|
|
+ MetadataList.assignValue(MD, NextMetadataNo++);
|
|
|
break;
|
|
|
}
|
|
|
case bitc::METADATA_KIND: {
|
|
@@ -3062,22 +3066,21 @@ std::error_code BitcodeReader::materializeMetadata() {
|
|
|
|
|
|
void BitcodeReader::setStripDebugInfo() { StripDebugInfo = true; }
|
|
|
|
|
|
-void BitcodeReader::saveMDValueList(
|
|
|
- DenseMap<const Metadata *, unsigned> &MDValueToValIDMap, bool OnlyTempMD) {
|
|
|
- for (unsigned ValID = 0; ValID < MDValueList.size(); ++ValID) {
|
|
|
- Metadata *MD = MDValueList[ValID];
|
|
|
+void BitcodeReader::saveMetadataList(
|
|
|
+ DenseMap<const Metadata *, unsigned> &MetadataToIDs, bool OnlyTempMD) {
|
|
|
+ for (unsigned ID = 0; ID < MetadataList.size(); ++ID) {
|
|
|
+ Metadata *MD = MetadataList[ID];
|
|
|
auto *N = dyn_cast_or_null<MDNode>(MD);
|
|
|
// Save all values if !OnlyTempMD, otherwise just the temporary metadata.
|
|
|
if (!OnlyTempMD || (N && N->isTemporary())) {
|
|
|
// Will call this after materializing each function, in order to
|
|
|
// handle remapping of the function's instructions/metadata.
|
|
|
// See if we already have an entry in that case.
|
|
|
- if (OnlyTempMD && MDValueToValIDMap.count(MD)) {
|
|
|
- assert(MDValueToValIDMap[MD] == ValID &&
|
|
|
- "Inconsistent metadata value id");
|
|
|
+ if (OnlyTempMD && MetadataToIDs.count(MD)) {
|
|
|
+ assert(MetadataToIDs[MD] == ID && "Inconsistent metadata value id");
|
|
|
continue;
|
|
|
}
|
|
|
- MDValueToValIDMap[MD] = ValID;
|
|
|
+ MetadataToIDs[MD] = ID;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3677,15 +3680,15 @@ std::error_code BitcodeReader::parseModule(uint64_t ResumeBit,
|
|
|
// based on their ordering in the bitcode, with the function-level
|
|
|
// metadata ids starting after the module-level metadata ids. Otherwise,
|
|
|
// we would have to parse the module-level metadata block to prime the
|
|
|
- // MDValueList when we are lazy loading metadata during function
|
|
|
- // importing. Initialize the MDValueList size here based on the
|
|
|
+ // MetadataList when we are lazy loading metadata during function
|
|
|
+ // importing. Initialize the MetadataList size here based on the
|
|
|
// record value, regardless of whether we are doing lazy metadata
|
|
|
// loading, so that we have consistent handling and assertion
|
|
|
// checking in parseMetadata for module-level metadata.
|
|
|
NumModuleMDs = Record[0];
|
|
|
SeenModuleValuesRecord = true;
|
|
|
- assert(MDValueList.size() == 0);
|
|
|
- MDValueList.resize(NumModuleMDs);
|
|
|
+ assert(MetadataList.size() == 0);
|
|
|
+ MetadataList.resize(NumModuleMDs);
|
|
|
break;
|
|
|
}
|
|
|
Record.clear();
|
|
@@ -3887,7 +3890,7 @@ std::error_code BitcodeReader::parseMetadataAttachment(Function &F) {
|
|
|
auto K = MDKindMap.find(Record[I]);
|
|
|
if (K == MDKindMap.end())
|
|
|
return error("Invalid ID");
|
|
|
- Metadata *MD = MDValueList.getValueFwdRef(Record[I + 1]);
|
|
|
+ Metadata *MD = MetadataList.getValueFwdRef(Record[I + 1]);
|
|
|
F.setMetadata(K->second, cast<MDNode>(MD));
|
|
|
}
|
|
|
continue;
|
|
@@ -3901,7 +3904,7 @@ std::error_code BitcodeReader::parseMetadataAttachment(Function &F) {
|
|
|
MDKindMap.find(Kind);
|
|
|
if (I == MDKindMap.end())
|
|
|
return error("Invalid ID");
|
|
|
- Metadata *Node = MDValueList.getValueFwdRef(Record[i + 1]);
|
|
|
+ Metadata *Node = MetadataList.getValueFwdRef(Record[i + 1]);
|
|
|
if (isa<LocalAsMetadata>(Node))
|
|
|
// Drop the attachment. This used to be legal, but there's no
|
|
|
// upgrade path.
|
|
@@ -3937,7 +3940,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
|
|
|
|
|
InstructionList.clear();
|
|
|
unsigned ModuleValueListSize = ValueList.size();
|
|
|
- unsigned ModuleMDValueListSize = MDValueList.size();
|
|
|
+ unsigned ModuleMetadataListSize = MetadataList.size();
|
|
|
|
|
|
// Add all the function arguments to the value table.
|
|
|
for (Argument &I : F->args())
|
|
@@ -4067,8 +4070,10 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
|
|
unsigned ScopeID = Record[2], IAID = Record[3];
|
|
|
|
|
|
MDNode *Scope = nullptr, *IA = nullptr;
|
|
|
- if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1));
|
|
|
- if (IAID) IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1));
|
|
|
+ if (ScopeID)
|
|
|
+ Scope = cast<MDNode>(MetadataList.getValueFwdRef(ScopeID - 1));
|
|
|
+ if (IAID)
|
|
|
+ IA = cast<MDNode>(MetadataList.getValueFwdRef(IAID - 1));
|
|
|
LastLoc = DebugLoc::get(Line, Col, Scope, IA);
|
|
|
I->setDebugLoc(LastLoc);
|
|
|
I = nullptr;
|
|
@@ -5189,7 +5194,7 @@ OutOfRecordLoop:
|
|
|
|
|
|
// Trim the value list down to the size it was before we parsed this function.
|
|
|
ValueList.shrinkTo(ModuleValueListSize);
|
|
|
- MDValueList.shrinkTo(ModuleMDValueListSize);
|
|
|
+ MetadataList.shrinkTo(ModuleMetadataListSize);
|
|
|
std::vector<BasicBlock*>().swap(FunctionBBs);
|
|
|
return std::error_code();
|
|
|
}
|
|
@@ -5220,7 +5225,7 @@ void BitcodeReader::releaseBuffer() { Buffer.release(); }
|
|
|
|
|
|
std::error_code BitcodeReader::materialize(GlobalValue *GV) {
|
|
|
// In older bitcode we must materialize the metadata before parsing
|
|
|
- // any functions, in order to set up the MDValueList properly.
|
|
|
+ // any functions, in order to set up the MetadataList properly.
|
|
|
if (!SeenModuleValuesRecord) {
|
|
|
if (std::error_code EC = materializeMetadata())
|
|
|
return EC;
|