mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[Alignment][NFC] Remove dependency on GlobalObject::setAlignment(unsigned)
Summary: This is patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: courbet Subscribers: arsenm, mehdi_amini, jvesely, nhaehnle, hiraditya, steven_wu, dexonsmith, dang, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68944 llvm-svn: 374880
This commit is contained in:
parent
dd39b25648
commit
89f87ca322
@ -64,7 +64,8 @@ public:
|
||||
}
|
||||
|
||||
/// FIXME: Remove this setter once the migration to MaybeAlign is over.
|
||||
void setAlignment(unsigned Align);
|
||||
LLVM_ATTRIBUTE_DEPRECATED(void setAlignment(unsigned Align),
|
||||
"Please use `void setAlignment(MaybeAlign Align)`");
|
||||
void setAlignment(MaybeAlign Align);
|
||||
|
||||
unsigned getGlobalObjectSubClassData() const {
|
||||
|
@ -309,7 +309,7 @@ private:
|
||||
RegularLTOState(unsigned ParallelCodeGenParallelismLevel, Config &Conf);
|
||||
struct CommonResolution {
|
||||
uint64_t Size = 0;
|
||||
unsigned Align = 0;
|
||||
MaybeAlign Align;
|
||||
/// Record if at least one instance of the common was marked as prevailing
|
||||
bool Prevailing = false;
|
||||
};
|
||||
|
@ -140,7 +140,7 @@ bool LLParser::ValidateEndOfModule() {
|
||||
// If the alignment was parsed as an attribute, move to the alignment
|
||||
// field.
|
||||
if (FnAttrs.hasAlignmentAttr()) {
|
||||
Fn->setAlignment(FnAttrs.getAlignment());
|
||||
Fn->setAlignment(MaybeAlign(FnAttrs.getAlignment()));
|
||||
FnAttrs.removeAttribute(Attribute::Alignment);
|
||||
}
|
||||
|
||||
@ -1124,7 +1124,7 @@ bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc,
|
||||
} else if (Lex.getKind() == lltok::kw_align) {
|
||||
unsigned Alignment;
|
||||
if (ParseOptionalAlignment(Alignment)) return true;
|
||||
GV->setAlignment(Alignment);
|
||||
GV->setAlignment(MaybeAlign(Alignment));
|
||||
} else if (Lex.getKind() == lltok::MetadataVar) {
|
||||
if (ParseGlobalObjectMetadataAttachment(*GV))
|
||||
return true;
|
||||
@ -5487,7 +5487,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
|
||||
Fn->setCallingConv(CC);
|
||||
Fn->setAttributes(PAL);
|
||||
Fn->setUnnamedAddr(UnnamedAddr);
|
||||
Fn->setAlignment(Alignment);
|
||||
Fn->setAlignment(MaybeAlign(Alignment));
|
||||
Fn->setSection(Section);
|
||||
Fn->setPartition(Partition);
|
||||
Fn->setComdat(C);
|
||||
|
@ -722,7 +722,7 @@ private:
|
||||
/// Converts alignment exponent (i.e. power of two (or zero)) to the
|
||||
/// corresponding alignment to use. If alignment is too large, returns
|
||||
/// a corresponding error code.
|
||||
Error parseAlignmentValue(uint64_t Exponent, unsigned &Alignment);
|
||||
Error parseAlignmentValue(uint64_t Exponent, MaybeAlign &Alignment);
|
||||
Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
|
||||
Error parseModule(uint64_t ResumeBit, bool ShouldLazyLoadMetadata = false);
|
||||
|
||||
@ -1544,12 +1544,12 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {
|
||||
}
|
||||
|
||||
Error BitcodeReader::parseAlignmentValue(uint64_t Exponent,
|
||||
unsigned &Alignment) {
|
||||
MaybeAlign &Alignment) {
|
||||
// Note: Alignment in bitcode files is incremented by 1, so that zero
|
||||
// can be used for default alignment.
|
||||
if (Exponent > Value::MaxAlignmentExponent + 1)
|
||||
return error("Invalid alignment value");
|
||||
Alignment = (1 << static_cast<unsigned>(Exponent)) >> 1;
|
||||
Alignment = decodeMaybeAlign(Exponent);
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
@ -3112,7 +3112,7 @@ Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
|
||||
|
||||
uint64_t RawLinkage = Record[3];
|
||||
GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage);
|
||||
unsigned Alignment;
|
||||
MaybeAlign Alignment;
|
||||
if (Error Err = parseAlignmentValue(Record[4], Alignment))
|
||||
return Err;
|
||||
std::string Section;
|
||||
@ -3243,7 +3243,7 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
|
||||
Context, getPointerElementFlatType(PTy)));
|
||||
}
|
||||
|
||||
unsigned Alignment;
|
||||
MaybeAlign Alignment;
|
||||
if (Error Err = parseAlignmentValue(Record[5], Alignment))
|
||||
return Err;
|
||||
Func->setAlignment(Alignment);
|
||||
@ -4750,7 +4750,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
}
|
||||
Type *OpTy = getTypeByID(Record[1]);
|
||||
Value *Size = getFnValueByID(Record[2], OpTy);
|
||||
unsigned Align;
|
||||
MaybeAlign Align;
|
||||
if (Error Err = parseAlignmentValue(AlignRecord & ~FlagMask, Align)) {
|
||||
return Err;
|
||||
}
|
||||
@ -4761,7 +4761,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
const DataLayout &DL = TheModule->getDataLayout();
|
||||
unsigned AS = DL.getAllocaAddrSpace();
|
||||
|
||||
AllocaInst *AI = new AllocaInst(Ty, AS, Size, Align);
|
||||
AllocaInst *AI = new AllocaInst(Ty, AS, Size, Align ? Align->value() : 0);
|
||||
AI->setUsedWithInAlloca(InAlloca);
|
||||
AI->setSwiftError(SwiftError);
|
||||
I = AI;
|
||||
@ -4789,10 +4789,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
if (Error Err = typeCheckLoadStoreInst(Ty, Op->getType()))
|
||||
return Err;
|
||||
|
||||
unsigned Align;
|
||||
MaybeAlign Align;
|
||||
if (Error Err = parseAlignmentValue(Record[OpNum], Align))
|
||||
return Err;
|
||||
I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align);
|
||||
I = new LoadInst(Ty, Op, "", Record[OpNum + 1],
|
||||
Align ? Align->value() : 0);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
@ -4826,10 +4827,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
return error("Invalid record");
|
||||
SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
|
||||
|
||||
unsigned Align;
|
||||
MaybeAlign Align;
|
||||
if (Error Err = parseAlignmentValue(Record[OpNum], Align))
|
||||
return Err;
|
||||
I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align, Ordering, SSID);
|
||||
I = new LoadInst(Ty, Op, "", Record[OpNum + 1],
|
||||
Align ? Align->value() : 0, Ordering, SSID);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
@ -4848,10 +4850,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
|
||||
if (Error Err = typeCheckLoadStoreInst(Val->getType(), Ptr->getType()))
|
||||
return Err;
|
||||
unsigned Align;
|
||||
MaybeAlign Align;
|
||||
if (Error Err = parseAlignmentValue(Record[OpNum], Align))
|
||||
return Err;
|
||||
I = new StoreInst(Val, Ptr, Record[OpNum+1], Align);
|
||||
I = new StoreInst(Val, Ptr, Record[OpNum + 1],
|
||||
Align ? Align->value() : 0);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
@ -4881,10 +4884,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
|
||||
return error("Invalid record");
|
||||
|
||||
unsigned Align;
|
||||
MaybeAlign Align;
|
||||
if (Error Err = parseAlignmentValue(Record[OpNum], Align))
|
||||
return Err;
|
||||
I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SSID);
|
||||
I = new StoreInst(Val, Ptr, Record[OpNum + 1], Align ? Align->value() : 0,
|
||||
Ordering, SSID);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
|
@ -1822,7 +1822,7 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool &ModifiedDT) {
|
||||
GV->getPointerAlignment(*DL) < PrefAlign &&
|
||||
DL->getTypeAllocSize(GV->getValueType()) >=
|
||||
MinSize + Offset2)
|
||||
GV->setAlignment(PrefAlign);
|
||||
GV->setAlignment(MaybeAlign(PrefAlign));
|
||||
}
|
||||
// If this is a memcpy (or similar) then we may be able to improve the
|
||||
// alignment
|
||||
|
@ -456,14 +456,14 @@ bool GlobalMerge::doMerge(const SmallVectorImpl<GlobalVariable *> &Globals,
|
||||
|
||||
bool HasExternal = false;
|
||||
StringRef FirstExternalName;
|
||||
unsigned MaxAlign = 1;
|
||||
Align MaxAlign;
|
||||
unsigned CurIdx = 0;
|
||||
for (j = i; j != -1; j = GlobalSet.find_next(j)) {
|
||||
Type *Ty = Globals[j]->getValueType();
|
||||
|
||||
// Make sure we use the same alignment AsmPrinter would use.
|
||||
unsigned Align = DL.getPreferredAlignment(Globals[j]);
|
||||
unsigned Padding = alignTo(MergedSize, Align) - MergedSize;
|
||||
Align Alignment(DL.getPreferredAlignment(Globals[j]));
|
||||
unsigned Padding = alignTo(MergedSize, Alignment) - MergedSize;
|
||||
MergedSize += Padding;
|
||||
MergedSize += DL.getTypeAllocSize(Ty);
|
||||
if (MergedSize > MaxOffset) {
|
||||
@ -478,7 +478,7 @@ bool GlobalMerge::doMerge(const SmallVectorImpl<GlobalVariable *> &Globals,
|
||||
Inits.push_back(Globals[j]->getInitializer());
|
||||
StructIdxs.push_back(CurIdx++);
|
||||
|
||||
MaxAlign = std::max(MaxAlign, Align);
|
||||
MaxAlign = std::max(MaxAlign, Alignment);
|
||||
|
||||
if (Globals[j]->hasExternalLinkage() && !HasExternal) {
|
||||
HasExternal = true;
|
||||
|
@ -142,7 +142,7 @@ bool LowerEmuTLS::addEmuTlsVar(Module &M, const GlobalVariable *GV) {
|
||||
assert(EmuTlsTmplVar && "Failed to create emualted TLS initializer");
|
||||
EmuTlsTmplVar->setConstant(true);
|
||||
EmuTlsTmplVar->setInitializer(const_cast<Constant*>(InitValue));
|
||||
EmuTlsTmplVar->setAlignment(GVAlignment);
|
||||
EmuTlsTmplVar->setAlignment(Align(GVAlignment));
|
||||
copyLinkageVisibility(M, GV, EmuTlsTmplVar);
|
||||
}
|
||||
|
||||
@ -155,9 +155,8 @@ bool LowerEmuTLS::addEmuTlsVar(Module &M, const GlobalVariable *GV) {
|
||||
ArrayRef<Constant*> ElementValueArray(ElementValues, 4);
|
||||
EmuTlsVar->setInitializer(
|
||||
ConstantStruct::get(EmuTlsVarType, ElementValueArray));
|
||||
unsigned MaxAlignment = std::max(
|
||||
DL.getABITypeAlignment(WordType),
|
||||
DL.getABITypeAlignment(VoidPtrType));
|
||||
Align MaxAlignment(std::max(DL.getABITypeAlignment(WordType),
|
||||
DL.getABITypeAlignment(VoidPtrType)));
|
||||
EmuTlsVar->setAlignment(MaxAlignment);
|
||||
return true;
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ void IRSpeculationLayer::emit(MaterializationResponsibility R,
|
||||
M, LoadValueTy, false, GlobalValue::LinkageTypes::InternalLinkage,
|
||||
ConstantInt::get(LoadValueTy, 0),
|
||||
"__orc_speculate.guard.for." + Fn.getName());
|
||||
SpeculatorGuard->setAlignment(1);
|
||||
SpeculatorGuard->setAlignment(Align::None());
|
||||
SpeculatorGuard->setUnnamedAddr(GlobalValue::UnnamedAddr::Local);
|
||||
|
||||
BasicBlock &ProgramEntry = Fn.getEntryBlock();
|
||||
|
@ -2008,7 +2008,7 @@ unsigned LLVMGetAlignment(LLVMValueRef V) {
|
||||
void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes) {
|
||||
Value *P = unwrap<Value>(V);
|
||||
if (GlobalObject *GV = dyn_cast<GlobalObject>(P))
|
||||
GV->setAlignment(Bytes);
|
||||
GV->setAlignment(MaybeAlign(Bytes));
|
||||
else if (AllocaInst *AI = dyn_cast<AllocaInst>(P))
|
||||
AI->setAlignment(MaybeAlign(Bytes));
|
||||
else if (LoadInst *LI = dyn_cast<LoadInst>(P))
|
||||
|
@ -129,7 +129,7 @@ void GlobalObject::setAlignment(MaybeAlign Align) {
|
||||
|
||||
void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {
|
||||
GlobalValue::copyAttributesFrom(Src);
|
||||
setAlignment(Src->getAlignment());
|
||||
setAlignment(MaybeAlign(Src->getAlignment()));
|
||||
setSection(Src->getSection());
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ GlobalVariable *IRBuilderBase::CreateGlobalString(StringRef Str,
|
||||
nullptr, GlobalVariable::NotThreadLocal,
|
||||
AddressSpace);
|
||||
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
|
||||
GV->setAlignment(1);
|
||||
GV->setAlignment(Align::None());
|
||||
return GV;
|
||||
}
|
||||
|
||||
|
@ -762,7 +762,8 @@ LTO::addRegularLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
|
||||
// For now they aren't reported correctly by ModuleSymbolTable.
|
||||
auto &CommonRes = RegularLTO.Commons[Sym.getIRName()];
|
||||
CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize());
|
||||
CommonRes.Align = std::max(CommonRes.Align, Sym.getCommonAlignment());
|
||||
CommonRes.Align =
|
||||
std::max(CommonRes.Align, MaybeAlign(Sym.getCommonAlignment()));
|
||||
CommonRes.Prevailing |= Res.Prevailing;
|
||||
}
|
||||
|
||||
|
@ -629,7 +629,7 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) {
|
||||
/*init*/ nullptr, SGVar->getName(),
|
||||
/*insertbefore*/ nullptr, SGVar->getThreadLocalMode(),
|
||||
SGVar->getType()->getAddressSpace());
|
||||
NewDGV->setAlignment(SGVar->getAlignment());
|
||||
NewDGV->setAlignment(MaybeAlign(SGVar->getAlignment()));
|
||||
NewDGV->copyAttributesFrom(SGVar);
|
||||
return NewDGV;
|
||||
}
|
||||
|
@ -351,7 +351,8 @@ bool ModuleLinker::linkIfNeeded(GlobalValue &GV) {
|
||||
SGVar->setConstant(false);
|
||||
}
|
||||
if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) {
|
||||
unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment());
|
||||
MaybeAlign Align(
|
||||
std::max(DGVar->getAlignment(), SGVar->getAlignment()));
|
||||
SGVar->setAlignment(Align);
|
||||
DGVar->setAlignment(Align);
|
||||
}
|
||||
|
@ -801,7 +801,7 @@ bool AMDGPUPromoteAlloca::handleAlloca(AllocaInst &I, bool SufficientLDS) {
|
||||
GlobalVariable::NotThreadLocal,
|
||||
AMDGPUAS::LOCAL_ADDRESS);
|
||||
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
|
||||
GV->setAlignment(I.getAlignment());
|
||||
GV->setAlignment(MaybeAlign(I.getAlignment()));
|
||||
|
||||
Value *TCntY, *TCntZ;
|
||||
|
||||
|
@ -120,7 +120,7 @@ static void replace(Module &M, GlobalVariable *Old, GlobalVariable *New) {
|
||||
|
||||
// Bump the alignment if necessary.
|
||||
if (Old->getAlignment() || New->getAlignment())
|
||||
New->setAlignment(std::max(getAlignment(Old), getAlignment(New)));
|
||||
New->setAlignment(Align(std::max(getAlignment(Old), getAlignment(New))));
|
||||
|
||||
copyDebugLocMetadata(Old, New);
|
||||
Old->replaceAllUsesWith(NewConstant);
|
||||
|
@ -108,7 +108,7 @@ void CrossDSOCFI::buildCFICheck(Module &M) {
|
||||
// Take over the existing function. The frontend emits a weak stub so that the
|
||||
// linker knows about the symbol; this pass replaces the function body.
|
||||
F->deleteBody();
|
||||
F->setAlignment(4096);
|
||||
F->setAlignment(Align(4096));
|
||||
|
||||
Triple T(M.getTargetTriple());
|
||||
if (T.isARM() || T.isThumb())
|
||||
|
@ -497,8 +497,8 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
|
||||
// had 256 byte alignment for example, something might depend on that:
|
||||
// propagate info to each field.
|
||||
uint64_t FieldOffset = Layout.getElementOffset(i);
|
||||
unsigned NewAlign = (unsigned)MinAlign(StartAlignment, FieldOffset);
|
||||
if (NewAlign > DL.getABITypeAlignment(STy->getElementType(i)))
|
||||
Align NewAlign(MinAlign(StartAlignment, FieldOffset));
|
||||
if (NewAlign > Align(DL.getABITypeAlignment(STy->getElementType(i))))
|
||||
NGV->setAlignment(NewAlign);
|
||||
|
||||
// Copy over the debug info for the variable.
|
||||
@ -513,7 +513,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
|
||||
NewGlobals.reserve(NumElements);
|
||||
auto ElTy = STy->getElementType();
|
||||
uint64_t EltSize = DL.getTypeAllocSize(ElTy);
|
||||
unsigned EltAlign = DL.getABITypeAlignment(ElTy);
|
||||
Align EltAlign(DL.getABITypeAlignment(ElTy));
|
||||
uint64_t FragmentSizeInBits = DL.getTypeAllocSizeInBits(ElTy);
|
||||
for (unsigned i = 0, e = NumElements; i != e; ++i) {
|
||||
Constant *In = Init->getAggregateElement(i);
|
||||
@ -532,7 +532,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
|
||||
// Calculate the known alignment of the field. If the original aggregate
|
||||
// had 256 byte alignment for example, something might depend on that:
|
||||
// propagate info to each field.
|
||||
unsigned NewAlign = (unsigned)MinAlign(StartAlignment, EltSize*i);
|
||||
Align NewAlign(MinAlign(StartAlignment, EltSize * i));
|
||||
if (NewAlign > EltAlign)
|
||||
NGV->setAlignment(NewAlign);
|
||||
transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits,
|
||||
|
@ -822,16 +822,16 @@ void LowerTypeTestsModule::buildBitSetsFromGlobalVariables(
|
||||
std::vector<Constant *> GlobalInits;
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
|
||||
uint64_t MaxAlign = 0;
|
||||
Align MaxAlign;
|
||||
uint64_t CurOffset = 0;
|
||||
uint64_t DesiredPadding = 0;
|
||||
for (GlobalTypeMember *G : Globals) {
|
||||
auto *GV = cast<GlobalVariable>(G->getGlobal());
|
||||
uint64_t Align = GV->getAlignment();
|
||||
if (Align == 0)
|
||||
Align = DL.getABITypeAlignment(GV->getValueType());
|
||||
MaxAlign = std::max(MaxAlign, Align);
|
||||
uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, Align);
|
||||
MaybeAlign Alignment(GV->getAlignment());
|
||||
if (!Alignment)
|
||||
Alignment = Align(DL.getABITypeAlignment(GV->getValueType()));
|
||||
MaxAlign = std::max(MaxAlign, *Alignment);
|
||||
uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, *Alignment);
|
||||
GlobalLayout[G] = GVOffset;
|
||||
if (GVOffset != 0) {
|
||||
uint64_t Padding = GVOffset - CurOffset;
|
||||
@ -1363,7 +1363,7 @@ void LowerTypeTestsModule::createJumpTable(
|
||||
cast<Function>(Functions[I]->getGlobal()));
|
||||
|
||||
// Align the whole table by entry size.
|
||||
F->setAlignment(getJumpTableEntrySize());
|
||||
F->setAlignment(Align(getJumpTableEntrySize()));
|
||||
// Skip prologue.
|
||||
// Disabled on win32 due to https://llvm.org/bugs/show_bug.cgi?id=28641#c3.
|
||||
// Luckily, this function does not get any prologue even without the
|
||||
|
@ -769,7 +769,7 @@ void MergeFunctions::writeAlias(Function *F, Function *G) {
|
||||
PtrType->getElementType(), PtrType->getAddressSpace(),
|
||||
G->getLinkage(), "", BitcastF, G->getParent());
|
||||
|
||||
F->setAlignment(std::max(F->getAlignment(), G->getAlignment()));
|
||||
F->setAlignment(MaybeAlign(std::max(F->getAlignment(), G->getAlignment())));
|
||||
GA->takeName(G);
|
||||
GA->setVisibility(G->getVisibility());
|
||||
GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
|
||||
@ -816,7 +816,7 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
|
||||
removeUsers(F);
|
||||
F->replaceAllUsesWith(NewF);
|
||||
|
||||
unsigned MaxAlignment = std::max(G->getAlignment(), NewF->getAlignment());
|
||||
MaybeAlign MaxAlignment(std::max(G->getAlignment(), NewF->getAlignment()));
|
||||
|
||||
writeThunkOrAlias(F, G);
|
||||
writeThunkOrAlias(F, NewF);
|
||||
|
@ -1516,10 +1516,11 @@ void DevirtModule::rebuildGlobal(VTableBits &B) {
|
||||
|
||||
// Align the before byte array to the global's minimum alignment so that we
|
||||
// don't break any alignment requirements on the global.
|
||||
unsigned Align = B.GV->getAlignment();
|
||||
if (Align == 0)
|
||||
Align = M.getDataLayout().getABITypeAlignment(B.GV->getValueType());
|
||||
B.Before.Bytes.resize(alignTo(B.Before.Bytes.size(), Align));
|
||||
MaybeAlign Alignment(B.GV->getAlignment());
|
||||
if (!Alignment)
|
||||
Alignment =
|
||||
Align(M.getDataLayout().getABITypeAlignment(B.GV->getValueType()));
|
||||
B.Before.Bytes.resize(alignTo(B.Before.Bytes.size(), Alignment));
|
||||
|
||||
// Before was stored in reverse order; flip it now.
|
||||
for (size_t I = 0, Size = B.Before.Bytes.size(); I != Size / 2; ++I)
|
||||
@ -1536,7 +1537,7 @@ void DevirtModule::rebuildGlobal(VTableBits &B) {
|
||||
GlobalVariable::PrivateLinkage, NewInit, "", B.GV);
|
||||
NewGV->setSection(B.GV->getSection());
|
||||
NewGV->setComdat(B.GV->getComdat());
|
||||
NewGV->setAlignment(B.GV->getAlignment());
|
||||
NewGV->setAlignment(MaybeAlign(B.GV->getAlignment()));
|
||||
|
||||
// Copy the original vtable's metadata to the anonymous global, adjusting
|
||||
// offsets as required.
|
||||
|
@ -2054,7 +2054,7 @@ void ModuleAddressSanitizer::InstrumentGlobalsCOFF(
|
||||
unsigned SizeOfGlobalStruct = DL.getTypeAllocSize(Initializer->getType());
|
||||
assert(isPowerOf2_32(SizeOfGlobalStruct) &&
|
||||
"global metadata will not be padded appropriately");
|
||||
Metadata->setAlignment(SizeOfGlobalStruct);
|
||||
Metadata->setAlignment(assumeAligned(SizeOfGlobalStruct));
|
||||
|
||||
SetComdatForGlobalMetadata(G, Metadata, "");
|
||||
}
|
||||
@ -2191,7 +2191,7 @@ void ModuleAddressSanitizer::InstrumentGlobalsWithMetadataArray(
|
||||
M, ArrayOfGlobalStructTy, false, GlobalVariable::InternalLinkage,
|
||||
ConstantArray::get(ArrayOfGlobalStructTy, MetadataInitializers), "");
|
||||
if (Mapping.Scale > 3)
|
||||
AllGlobals->setAlignment(1ULL << Mapping.Scale);
|
||||
AllGlobals->setAlignment(Align(1ULL << Mapping.Scale));
|
||||
|
||||
IRB.CreateCall(AsanRegisterGlobals,
|
||||
{IRB.CreatePointerCast(AllGlobals, IntptrTy),
|
||||
@ -2291,7 +2291,7 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M,
|
||||
"", G, G->getThreadLocalMode());
|
||||
NewGlobal->copyAttributesFrom(G);
|
||||
NewGlobal->setComdat(G->getComdat());
|
||||
NewGlobal->setAlignment(MinRZ);
|
||||
NewGlobal->setAlignment(MaybeAlign(MinRZ));
|
||||
// Don't fold globals with redzones. ODR violation detector and redzone
|
||||
// poisoning implicitly creates a dependence on the global's address, so it
|
||||
// is no longer valid for it to be marked unnamed_addr.
|
||||
@ -2359,7 +2359,7 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M,
|
||||
// Set meaningful attributes for indicator symbol.
|
||||
ODRIndicatorSym->setVisibility(NewGlobal->getVisibility());
|
||||
ODRIndicatorSym->setDLLStorageClass(NewGlobal->getDLLStorageClass());
|
||||
ODRIndicatorSym->setAlignment(1);
|
||||
ODRIndicatorSym->setAlignment(Align::None());
|
||||
ODRIndicator = ODRIndicatorSym;
|
||||
}
|
||||
|
||||
|
@ -1265,7 +1265,7 @@ void HWAddressSanitizer::instrumentGlobal(GlobalVariable *GV, uint8_t Tag) {
|
||||
NewGV->setLinkage(GlobalValue::PrivateLinkage);
|
||||
NewGV->copyMetadata(GV, 0);
|
||||
NewGV->setAlignment(
|
||||
std::max(GV->getAlignment(), Mapping.getObjectAlignment()));
|
||||
MaybeAlign(std::max(GV->getAlignment(), Mapping.getObjectAlignment())));
|
||||
|
||||
// It is invalid to ICF two globals that have different tags. In the case
|
||||
// where the size of the global is a multiple of the tag granularity the
|
||||
@ -1370,7 +1370,7 @@ void HWAddressSanitizer::instrumentGlobals() {
|
||||
GlobalValue::PrivateLinkage, nullptr, kHwasanNoteName);
|
||||
Note->setSection(".note.hwasan.globals");
|
||||
Note->setComdat(NoteComdat);
|
||||
Note->setAlignment(4);
|
||||
Note->setAlignment(Align(4));
|
||||
Note->setDSOLocal(true);
|
||||
|
||||
// The pointers in the note need to be relative so that the note ends up being
|
||||
|
@ -785,7 +785,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
||||
CounterPtr->setVisibility(Visibility);
|
||||
CounterPtr->setSection(
|
||||
getInstrProfSectionName(IPSK_cnts, TT.getObjectFormat()));
|
||||
CounterPtr->setAlignment(8);
|
||||
CounterPtr->setAlignment(Align(8));
|
||||
MaybeSetComdat(CounterPtr);
|
||||
CounterPtr->setLinkage(Linkage);
|
||||
|
||||
@ -807,7 +807,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
||||
ValuesVar->setVisibility(Visibility);
|
||||
ValuesVar->setSection(
|
||||
getInstrProfSectionName(IPSK_vals, TT.getObjectFormat()));
|
||||
ValuesVar->setAlignment(8);
|
||||
ValuesVar->setAlignment(Align(8));
|
||||
MaybeSetComdat(ValuesVar);
|
||||
ValuesPtrExpr =
|
||||
ConstantExpr::getBitCast(ValuesVar, Type::getInt8PtrTy(Ctx));
|
||||
@ -840,7 +840,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
||||
getVarName(Inc, getInstrProfDataVarPrefix()));
|
||||
Data->setVisibility(Visibility);
|
||||
Data->setSection(getInstrProfSectionName(IPSK_data, TT.getObjectFormat()));
|
||||
Data->setAlignment(INSTR_PROF_DATA_ALIGNMENT);
|
||||
Data->setAlignment(Align(INSTR_PROF_DATA_ALIGNMENT));
|
||||
MaybeSetComdat(Data);
|
||||
Data->setLinkage(Linkage);
|
||||
|
||||
@ -931,7 +931,7 @@ void InstrProfiling::emitNameData() {
|
||||
// On COFF, it's important to reduce the alignment down to 1 to prevent the
|
||||
// linker from inserting padding before the start of the names section or
|
||||
// between names entries.
|
||||
NamesVar->setAlignment(1);
|
||||
NamesVar->setAlignment(Align::None());
|
||||
UsedVars.push_back(NamesVar);
|
||||
|
||||
for (auto *NamePtr : ReferencedNames)
|
||||
|
@ -68,7 +68,8 @@ GlobalVariable *llvm::createPrivateGlobalForString(Module &M, StringRef Str,
|
||||
GlobalValue::PrivateLinkage, StrConst, NamePrefix);
|
||||
if (AllowMerging)
|
||||
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
|
||||
GV->setAlignment(1); // Strings may not be merged w/o setting align 1.
|
||||
GV->setAlignment(Align::None()); // Strings may not be merged w/o setting
|
||||
// alignment explicitly.
|
||||
return GV;
|
||||
}
|
||||
|
||||
|
@ -652,8 +652,9 @@ GlobalVariable *ModuleSanitizerCoverage::CreateFunctionLocalArrayInSection(
|
||||
GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId))
|
||||
Array->setComdat(Comdat);
|
||||
Array->setSection(getSectionName(Section));
|
||||
Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize()
|
||||
: Ty->getPrimitiveSizeInBits() / 8);
|
||||
Array->setAlignment(Align(Ty->isPointerTy()
|
||||
? DL->getPointerSize()
|
||||
: Ty->getPrimitiveSizeInBits() / 8));
|
||||
GlobalsToAppendToUsed.push_back(Array);
|
||||
GlobalsToAppendToCompilerUsed.push_back(Array);
|
||||
MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F));
|
||||
|
@ -1023,7 +1023,7 @@ bool LoopIdiomRecognize::processLoopStridedStore(
|
||||
GlobalValue::PrivateLinkage,
|
||||
PatternValue, ".memset_pattern");
|
||||
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); // Ok to merge these.
|
||||
GV->setAlignment(16);
|
||||
GV->setAlignment(Align(16));
|
||||
Value *PatternPtr = ConstantExpr::getBitCast(GV, Int8PtrTy);
|
||||
NewCall = Builder.CreateCall(MSP, {BasePtr, PatternPtr, NumBytes});
|
||||
}
|
||||
|
@ -1171,7 +1171,7 @@ static unsigned enforceKnownAlignment(Value *V, unsigned Alignment,
|
||||
if (!GO->canIncreaseAlignment())
|
||||
return Alignment;
|
||||
|
||||
GO->setAlignment(PrefAlign);
|
||||
GO->setAlignment(MaybeAlign(PrefAlign));
|
||||
return PrefAlign;
|
||||
}
|
||||
|
||||
|
@ -5085,7 +5085,7 @@ SwitchLookupTable::SwitchLookupTable(
|
||||
Array->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
|
||||
// Set the alignment to that of an array items. We will be only loading one
|
||||
// value out of it.
|
||||
Array->setAlignment(DL.getPrefTypeAlignment(ValueType));
|
||||
Array->setAlignment(Align(DL.getPrefTypeAlignment(ValueType)));
|
||||
Kind = ArrayKind;
|
||||
}
|
||||
|
||||
|
@ -476,13 +476,15 @@ TEST(ConstantsTest, BitcastToGEP) {
|
||||
}
|
||||
|
||||
bool foldFuncPtrAndConstToNull(LLVMContext &Context, Module *TheModule,
|
||||
uint64_t AndValue, unsigned FunctionAlign = 0) {
|
||||
uint64_t AndValue,
|
||||
MaybeAlign FunctionAlign = llvm::None) {
|
||||
Type *VoidType(Type::getVoidTy(Context));
|
||||
FunctionType *FuncType(FunctionType::get(VoidType, false));
|
||||
Function *Func(Function::Create(
|
||||
FuncType, GlobalValue::ExternalLinkage, "", TheModule));
|
||||
|
||||
if (FunctionAlign) Func->setAlignment(FunctionAlign);
|
||||
if (FunctionAlign)
|
||||
Func->setAlignment(*FunctionAlign);
|
||||
|
||||
IntegerType *ConstantIntType(Type::getInt32Ty(Context));
|
||||
ConstantInt *TheConstant(ConstantInt::get(ConstantIntType, AndValue));
|
||||
@ -547,21 +549,21 @@ TEST(ConstantsTest, FoldFunctionAlign4PtrAlignMultiple) {
|
||||
LLVMContext Context;
|
||||
Module TheModule("TestModule", Context);
|
||||
TheModule.setDataLayout("Fn8");
|
||||
ASSERT_TRUE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, 4));
|
||||
ASSERT_TRUE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, Align(4)));
|
||||
}
|
||||
|
||||
TEST(ConstantsTest, DontFoldFunctionAlign4PtrAlignIndependent) {
|
||||
LLVMContext Context;
|
||||
Module TheModule("TestModule", Context);
|
||||
TheModule.setDataLayout("Fi8");
|
||||
ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, 4));
|
||||
ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, Align(4)));
|
||||
}
|
||||
|
||||
TEST(ConstantsTest, DontFoldFunctionPtrIfNoModule) {
|
||||
LLVMContext Context;
|
||||
// Even though the function is explicitly 4 byte aligned, in the absence of a
|
||||
// DataLayout we can't assume that the function pointer is aligned.
|
||||
ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, nullptr, 2, 4));
|
||||
ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, nullptr, 2, Align(4)));
|
||||
}
|
||||
|
||||
TEST(ConstantsTest, FoldGlobalVariablePtr) {
|
||||
@ -572,7 +574,7 @@ TEST(ConstantsTest, FoldGlobalVariablePtr) {
|
||||
std::unique_ptr<GlobalVariable> Global(
|
||||
new GlobalVariable(IntType, true, GlobalValue::ExternalLinkage));
|
||||
|
||||
Global->setAlignment(4);
|
||||
Global->setAlignment(Align(4));
|
||||
|
||||
ConstantInt *TheConstant(ConstantInt::get(IntType, 2));
|
||||
|
||||
|
@ -151,7 +151,7 @@ TEST(FunctionTest, GetPointerAlignment) {
|
||||
EXPECT_EQ(4U, Func->getPointerAlignment(DataLayout("Fi32")));
|
||||
EXPECT_EQ(4U, Func->getPointerAlignment(DataLayout("Fn32")));
|
||||
|
||||
Func->setAlignment(4U);
|
||||
Func->setAlignment(Align(4));
|
||||
|
||||
EXPECT_EQ(0U, Func->getPointerAlignment(DataLayout("")));
|
||||
EXPECT_EQ(1U, Func->getPointerAlignment(DataLayout("Fi8")));
|
||||
|
@ -61,7 +61,7 @@ TEST(GlobalTest, CreateAddressSpace) {
|
||||
1);
|
||||
|
||||
EXPECT_TRUE(Value::MaximumAlignment == 536870912U);
|
||||
Dummy0->setAlignment(536870912U);
|
||||
Dummy0->setAlignment(Align(536870912));
|
||||
EXPECT_EQ(Dummy0->getAlignment(), 536870912U);
|
||||
|
||||
// Make sure the address space isn't dropped when returning this.
|
||||
@ -90,6 +90,7 @@ TEST(GlobalTest, CreateAddressSpace) {
|
||||
|
||||
#ifdef GTEST_HAS_DEATH_TEST
|
||||
#ifndef NDEBUG
|
||||
|
||||
TEST(GlobalTest, AlignDeath) {
|
||||
LLVMContext Ctx;
|
||||
std::unique_ptr<Module> M(new Module("TestModule", Ctx));
|
||||
@ -99,9 +100,7 @@ TEST(GlobalTest, AlignDeath) {
|
||||
Constant::getAllOnesValue(Int32Ty), "var", nullptr,
|
||||
GlobalVariable::NotThreadLocal, 1);
|
||||
|
||||
EXPECT_DEATH(Var->setAlignment(536870913U),
|
||||
"Alignment is neither 0 nor a power of 2");
|
||||
EXPECT_DEATH(Var->setAlignment(1073741824U),
|
||||
EXPECT_DEATH(Var->setAlignment(Align(1073741824U)),
|
||||
"Alignment is greater than MaximumAlignment");
|
||||
}
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user