[Alignment][NFC] Update Bitcodewriter to use Align
Differential Revision: https://reviews.llvm.org/D83533
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include "llvm/Bitcode/BitcodeReader.h"
|
||||
#include "llvm/Bitcode/LLVMBitCodes.h"
|
||||
#include "llvm/Bitstream/BitCodes.h"
|
||||
#include "llvm/Bitstream/BitcodeCommon.h"
|
||||
#include "llvm/Bitstream/BitstreamWriter.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
@@ -394,6 +395,8 @@ private:
|
||||
unsigned getEncodedSyncScopeID(SyncScope::ID SSID) {
|
||||
return unsigned(SSID);
|
||||
}
|
||||
|
||||
unsigned getEncodedAlign(MaybeAlign Alignment) { return encode(Alignment); }
|
||||
};
|
||||
|
||||
/// Class to manage the bitcode writing for a combined index.
|
||||
@@ -1181,10 +1184,14 @@ void ModuleBitcodeWriter::writeModuleInfo() {
|
||||
// compute the maximum alignment value.
|
||||
std::map<std::string, unsigned> SectionMap;
|
||||
std::map<std::string, unsigned> GCMap;
|
||||
unsigned MaxAlignment = 0;
|
||||
MaybeAlign MaxAlignment;
|
||||
unsigned MaxGlobalType = 0;
|
||||
const auto UpdateMaxAlignment = [&MaxAlignment](const MaybeAlign A) {
|
||||
if (A)
|
||||
MaxAlignment = !MaxAlignment ? *A : std::max(*MaxAlignment, *A);
|
||||
};
|
||||
for (const GlobalVariable &GV : M.globals()) {
|
||||
MaxAlignment = std::max(MaxAlignment, GV.getAlignment());
|
||||
UpdateMaxAlignment(GV.getAlign());
|
||||
MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getValueType()));
|
||||
if (GV.hasSection()) {
|
||||
// Give section names unique ID's.
|
||||
@@ -1197,7 +1204,7 @@ void ModuleBitcodeWriter::writeModuleInfo() {
|
||||
}
|
||||
}
|
||||
for (const Function &F : M) {
|
||||
MaxAlignment = std::max(MaxAlignment, F.getAlignment());
|
||||
UpdateMaxAlignment(F.getAlign());
|
||||
if (F.hasSection()) {
|
||||
// Give section names unique ID's.
|
||||
unsigned &Entry = SectionMap[std::string(F.getSection())];
|
||||
@@ -1233,10 +1240,10 @@ void ModuleBitcodeWriter::writeModuleInfo() {
|
||||
//| constant
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer.
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.
|
||||
if (MaxAlignment == 0) // Alignment.
|
||||
if (!MaxAlignment) // Alignment.
|
||||
Abbv->Add(BitCodeAbbrevOp(0));
|
||||
else {
|
||||
unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1;
|
||||
unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
|
||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
|
||||
Log2_32_Ceil(MaxEncAlignment+1)));
|
||||
}
|
||||
@@ -1289,7 +1296,7 @@ void ModuleBitcodeWriter::writeModuleInfo() {
|
||||
Vals.push_back(GV.isDeclaration() ? 0 :
|
||||
(VE.getValueID(GV.getInitializer()) + 1));
|
||||
Vals.push_back(getEncodedLinkage(GV));
|
||||
Vals.push_back(Log2_32(GV.getAlignment())+1);
|
||||
Vals.push_back(getEncodedAlign(GV.getAlign()));
|
||||
Vals.push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
|
||||
: 0);
|
||||
if (GV.isThreadLocal() ||
|
||||
@@ -1335,7 +1342,7 @@ void ModuleBitcodeWriter::writeModuleInfo() {
|
||||
Vals.push_back(F.isDeclaration());
|
||||
Vals.push_back(getEncodedLinkage(F));
|
||||
Vals.push_back(VE.getAttributeListID(F.getAttributes()));
|
||||
Vals.push_back(Log2_32(F.getAlignment())+1);
|
||||
Vals.push_back(getEncodedAlign(F.getAlign()));
|
||||
Vals.push_back(F.hasSection() ? SectionMap[std::string(F.getSection())]
|
||||
: 0);
|
||||
Vals.push_back(getEncodedVisibility(F));
|
||||
@@ -2945,14 +2952,13 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
|
||||
Vals.push_back(VE.getTypeID(AI.getAllocatedType()));
|
||||
Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
|
||||
Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
|
||||
unsigned AlignRecord = Log2_32(AI.getAlignment()) + 1;
|
||||
assert(Log2_32(Value::MaximumAlignment) + 1 < 1 << 5 &&
|
||||
"not enough bits for maximum alignment");
|
||||
assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64");
|
||||
AlignRecord |= AI.isUsedWithInAlloca() << 5;
|
||||
AlignRecord |= 1 << 6;
|
||||
AlignRecord |= AI.isSwiftError() << 7;
|
||||
Vals.push_back(AlignRecord);
|
||||
using APV = AllocaPackedValues;
|
||||
unsigned Record = 0;
|
||||
Bitfield::set<APV::Align>(Record, getEncodedAlign(AI.getAlign()));
|
||||
Bitfield::set<APV::UsedWithInAlloca>(Record, AI.isUsedWithInAlloca());
|
||||
Bitfield::set<APV::ExplicitType>(Record, true);
|
||||
Bitfield::set<APV::SwiftError>(Record, AI.isSwiftError());
|
||||
Vals.push_back(Record);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2966,7 +2972,7 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
|
||||
AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
|
||||
}
|
||||
Vals.push_back(VE.getTypeID(I.getType()));
|
||||
Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1);
|
||||
Vals.push_back(getEncodedAlign(cast<LoadInst>(I).getAlign()));
|
||||
Vals.push_back(cast<LoadInst>(I).isVolatile());
|
||||
if (cast<LoadInst>(I).isAtomic()) {
|
||||
Vals.push_back(getEncodedOrdering(cast<LoadInst>(I).getOrdering()));
|
||||
@@ -2980,7 +2986,7 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
|
||||
Code = bitc::FUNC_CODE_INST_STORE;
|
||||
pushValueAndType(I.getOperand(1), InstID, Vals); // ptrty + ptr
|
||||
pushValueAndType(I.getOperand(0), InstID, Vals); // valty + val
|
||||
Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1);
|
||||
Vals.push_back(getEncodedAlign(cast<StoreInst>(I).getAlign()));
|
||||
Vals.push_back(cast<StoreInst>(I).isVolatile());
|
||||
if (cast<StoreInst>(I).isAtomic()) {
|
||||
Vals.push_back(getEncodedOrdering(cast<StoreInst>(I).getOrdering()));
|
||||
|
||||
Reference in New Issue
Block a user