[opaque pointer type] encode the pointee type of global variables

Use a few extra bits in the const field (after widening it from a fixed
single bit) to stash the address space which is no longer provided by
the type (and an extra bit in there to specify that we're using that new
encoding).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2015-04-27 19:58:56 +00:00
parent dcc4f724cc
commit d455682f39
2 changed files with 20 additions and 12 deletions

View File

@ -2876,12 +2876,18 @@ std::error_code BitcodeReader::ParseModule(bool Resume,
Type *Ty = getTypeByID(Record[0]); Type *Ty = getTypeByID(Record[0]);
if (!Ty) if (!Ty)
return Error("Invalid record"); return Error("Invalid record");
if (!Ty->isPointerTy()) bool isConstant = Record[1] & 1;
return Error("Invalid type for value"); bool explicitType = Record[1] & 2;
unsigned AddressSpace = cast<PointerType>(Ty)->getAddressSpace(); unsigned AddressSpace;
Ty = cast<PointerType>(Ty)->getElementType(); if (explicitType) {
AddressSpace = Record[1] >> 2;
} else {
if (!Ty->isPointerTy())
return Error("Invalid type for value");
AddressSpace = cast<PointerType>(Ty)->getAddressSpace();
Ty = cast<PointerType>(Ty)->getElementType();
}
bool isConstant = Record[1];
uint64_t RawLinkage = Record[3]; uint64_t RawLinkage = Record[3];
GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage);
unsigned Alignment; unsigned Alignment;

View File

@ -590,7 +590,7 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,
unsigned MaxGlobalType = 0; unsigned MaxGlobalType = 0;
for (const GlobalValue &GV : M->globals()) { for (const GlobalValue &GV : M->globals()) {
MaxAlignment = std::max(MaxAlignment, GV.getAlignment()); MaxAlignment = std::max(MaxAlignment, GV.getAlignment());
MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getType())); MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getValueType()));
if (GV.hasSection()) { if (GV.hasSection()) {
// Give section names unique ID's. // Give section names unique ID's.
unsigned &Entry = SectionMap[GV.getSection()]; unsigned &Entry = SectionMap[GV.getSection()];
@ -631,10 +631,12 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,
Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR)); Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
Log2_32_Ceil(MaxGlobalType+1))); Log2_32_Ceil(MaxGlobalType+1)));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constant. Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddrSpace << 2
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. //| explicitType << 1
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage. //| constant
if (MaxAlignment == 0) // Alignment. Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer.
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.
if (MaxAlignment == 0) // Alignment.
Abbv->Add(BitCodeAbbrevOp(0)); Abbv->Add(BitCodeAbbrevOp(0));
else { else {
unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1;
@ -659,8 +661,8 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE,
// linkage, alignment, section, visibility, threadlocal, // linkage, alignment, section, visibility, threadlocal,
// unnamed_addr, externally_initialized, dllstorageclass, // unnamed_addr, externally_initialized, dllstorageclass,
// comdat] // comdat]
Vals.push_back(VE.getTypeID(GV.getType())); Vals.push_back(VE.getTypeID(GV.getValueType()));
Vals.push_back(GV.isConstant()); Vals.push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
Vals.push_back(GV.isDeclaration() ? 0 : Vals.push_back(GV.isDeclaration() ? 0 :
(VE.getValueID(GV.getInitializer()) + 1)); (VE.getValueID(GV.getInitializer()) + 1));
Vals.push_back(getEncodedLinkage(GV)); Vals.push_back(getEncodedLinkage(GV));