mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
[IR] Remove the DIExpression field from DIGlobalVariable.
This patch implements PR31013 by introducing a
DIGlobalVariableExpression that holds a pair of DIGlobalVariable and
DIExpression.
Currently, DIGlobalVariables holds a DIExpression. This is not the
best way to model this:
(1) The DIGlobalVariable should describe the source level variable,
not how to get to its location.
(2) It makes it unsafe/hard to update the expressions when we call
replaceExpression on the DIGLobalVariable.
(3) It makes it impossible to represent a global variable that is in
more than one location (e.g., a variable with multiple
DW_OP_LLVM_fragment-s). We also moved away from attaching the
DIExpression to DILocalVariable for the same reasons.
This reapplies r289902 with additional testcase upgrades and a change
to the Bitcode record for DIGlobalVariable, that makes upgrading the
old format unambiguous also for variables without DIExpressions.
<rdar://problem/29250149>
https://llvm.org/bugs/show_bug.cgi?id=31013
Differential Revision: https://reviews.llvm.org/D26769
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290153 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -980,41 +980,55 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel,
|
||||
if (Record.size() < 11 || Record.size() > 12)
|
||||
return error("Invalid record");
|
||||
|
||||
IsDistinct = Record[0];
|
||||
IsDistinct = Record[0] & 1;
|
||||
unsigned Version = Record[0] >> 1;
|
||||
|
||||
// Upgrade old metadata, which stored a global variable reference or a
|
||||
// ConstantInt here.
|
||||
Metadata *Expr = getMDOrNull(Record[9]);
|
||||
uint32_t AlignInBits = 0;
|
||||
if (Record.size() > 11) {
|
||||
if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
|
||||
return error("Alignment value is too large");
|
||||
AlignInBits = Record[11];
|
||||
}
|
||||
GlobalVariable *Attach = nullptr;
|
||||
if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
|
||||
if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
|
||||
Attach = GV;
|
||||
Expr = nullptr;
|
||||
} else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
|
||||
Expr = DIExpression::get(Context,
|
||||
{dwarf::DW_OP_constu, CI->getZExtValue(),
|
||||
dwarf::DW_OP_stack_value});
|
||||
} else {
|
||||
Expr = nullptr;
|
||||
if (Version == 1) {
|
||||
MetadataList.assignValue(
|
||||
GET_OR_DISTINCT(DIGlobalVariable,
|
||||
(Context, getMDOrNull(Record[1]),
|
||||
getMDString(Record[2]), getMDString(Record[3]),
|
||||
getMDOrNull(Record[4]), Record[5],
|
||||
getDITypeRefOrNull(Record[6]), Record[7],
|
||||
Record[8], getMDOrNull(Record[10]), Record[11])),
|
||||
NextMetadataNo++);
|
||||
} else if (Version == 0) {
|
||||
// Upgrade old metadata, which stored a global variable reference or a
|
||||
// ConstantInt here.
|
||||
Metadata *Expr = getMDOrNull(Record[9]);
|
||||
uint32_t AlignInBits = 0;
|
||||
if (Record.size() > 11) {
|
||||
if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
|
||||
return error("Alignment value is too large");
|
||||
AlignInBits = Record[11];
|
||||
}
|
||||
}
|
||||
GlobalVariable *Attach = nullptr;
|
||||
if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
|
||||
if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
|
||||
Attach = GV;
|
||||
Expr = nullptr;
|
||||
} else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
|
||||
Expr = DIExpression::get(Context,
|
||||
{dwarf::DW_OP_constu, CI->getZExtValue(),
|
||||
dwarf::DW_OP_stack_value});
|
||||
} else {
|
||||
Expr = nullptr;
|
||||
}
|
||||
}
|
||||
DIGlobalVariable *DGV = GET_OR_DISTINCT(
|
||||
DIGlobalVariable,
|
||||
(Context, getMDOrNull(Record[1]), getMDString(Record[2]),
|
||||
getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
|
||||
getDITypeRefOrNull(Record[6]), Record[7], Record[8],
|
||||
getMDOrNull(Record[10]), AlignInBits));
|
||||
|
||||
DIGlobalVariable *DGV = GET_OR_DISTINCT(
|
||||
DIGlobalVariable,
|
||||
(Context, getMDOrNull(Record[1]), getMDString(Record[2]),
|
||||
getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
|
||||
getDITypeRefOrNull(Record[6]), Record[7], Record[8], Expr,
|
||||
getMDOrNull(Record[10]), AlignInBits));
|
||||
MetadataList.assignValue(DGV, NextMetadataNo++);
|
||||
|
||||
if (Attach)
|
||||
Attach->addDebugInfo(DGV);
|
||||
auto *DGVE =
|
||||
DIGlobalVariableExpression::getDistinct(Context, DGV, Expr);
|
||||
MetadataList.assignValue(DGVE, NextMetadataNo++);
|
||||
if (Attach)
|
||||
Attach->addDebugInfo(DGVE);
|
||||
} else
|
||||
return error("Invalid record");
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -1064,6 +1078,17 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel,
|
||||
NextMetadataNo++);
|
||||
break;
|
||||
}
|
||||
case bitc::METADATA_GLOBAL_VAR_EXPR: {
|
||||
if (Record.size() != 3)
|
||||
return error("Invalid record");
|
||||
|
||||
IsDistinct = Record[0];
|
||||
MetadataList.assignValue(GET_OR_DISTINCT(DIGlobalVariableExpression,
|
||||
(Context, getMDOrNull(Record[1]),
|
||||
getMDOrNull(Record[2]))),
|
||||
NextMetadataNo++);
|
||||
break;
|
||||
}
|
||||
case bitc::METADATA_OBJC_PROPERTY: {
|
||||
if (Record.size() != 8)
|
||||
return error("Invalid record");
|
||||
|
||||
@@ -210,6 +210,9 @@ private:
|
||||
SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
|
||||
void writeDIExpression(const DIExpression *N,
|
||||
SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
|
||||
void writeDIGlobalVariableExpression(const DIGlobalVariableExpression *N,
|
||||
SmallVectorImpl<uint64_t> &Record,
|
||||
unsigned Abbrev);
|
||||
void writeDIObjCProperty(const DIObjCProperty *N,
|
||||
SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
|
||||
void writeDIImportedEntity(const DIImportedEntity *N,
|
||||
@@ -1674,7 +1677,8 @@ void ModuleBitcodeWriter::writeDITemplateValueParameter(
|
||||
void ModuleBitcodeWriter::writeDIGlobalVariable(
|
||||
const DIGlobalVariable *N, SmallVectorImpl<uint64_t> &Record,
|
||||
unsigned Abbrev) {
|
||||
Record.push_back(N->isDistinct());
|
||||
const uint64_t Version = 1 << 1;
|
||||
Record.push_back((uint64_t)N->isDistinct() | Version);
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getScope()));
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));
|
||||
@@ -1683,7 +1687,7 @@ void ModuleBitcodeWriter::writeDIGlobalVariable(
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getType()));
|
||||
Record.push_back(N->isLocalToUnit());
|
||||
Record.push_back(N->isDefinition());
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getRawExpr()));
|
||||
Record.push_back(/* expr */ 0);
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration()));
|
||||
Record.push_back(N->getAlignInBits());
|
||||
|
||||
@@ -1735,6 +1739,17 @@ void ModuleBitcodeWriter::writeDIExpression(const DIExpression *N,
|
||||
Record.clear();
|
||||
}
|
||||
|
||||
void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
|
||||
const DIGlobalVariableExpression *N, SmallVectorImpl<uint64_t> &Record,
|
||||
unsigned Abbrev) {
|
||||
Record.push_back(N->isDistinct());
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getVariable()));
|
||||
Record.push_back(VE.getMetadataOrNullID(N->getExpression()));
|
||||
|
||||
Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR_EXPR, Record, Abbrev);
|
||||
Record.clear();
|
||||
}
|
||||
|
||||
void ModuleBitcodeWriter::writeDIObjCProperty(const DIObjCProperty *N,
|
||||
SmallVectorImpl<uint64_t> &Record,
|
||||
unsigned Abbrev) {
|
||||
|
||||
Reference in New Issue
Block a user