mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Alignment][NFC] use llvm::Align for AsmPrinter::EmitAlignment
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: dschuff, sdardis, nemanjai, hiraditya, kbarton, jrtc27, MaskRay, atanasyan, jsji, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67443 llvm-svn: 371616
This commit is contained in:
parent
bd7acc7bbc
commit
8b89bc4ab7
@ -342,12 +342,11 @@ public:
|
||||
/// so, emit it and return true, otherwise do nothing and return false.
|
||||
bool EmitSpecialLLVMGlobal(const GlobalVariable *GV);
|
||||
|
||||
/// Emit an alignment directive to the specified power of two boundary. For
|
||||
/// example, if you pass in 3 here, you will get an 8 byte alignment. If a
|
||||
/// Emit an alignment directive to the specified power of two boundary. If a
|
||||
/// global value is specified, and if that global has an explicit alignment
|
||||
/// requested, it will override the alignment request if required for
|
||||
/// correctness.
|
||||
void EmitAlignment(unsigned NumBits, const GlobalObject *GV = nullptr) const;
|
||||
void EmitAlignment(llvm::Align Align, const GlobalObject *GV = nullptr) const;
|
||||
|
||||
/// Lower the specified LLVM Constant to an MCExpr.
|
||||
virtual const MCExpr *lowerConstant(const Constant *CV);
|
||||
@ -635,10 +634,9 @@ public:
|
||||
/// supported by the target.
|
||||
void EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
|
||||
|
||||
/// Return the alignment in log2 form for the specified \p GV.
|
||||
static unsigned getGVAlignmentLog2(const GlobalValue *GV,
|
||||
const DataLayout &DL,
|
||||
unsigned InBits = 0);
|
||||
/// Return the alignment for the specified \p GV.
|
||||
static llvm::Align getGVAlignment(const GlobalValue *GV, const DataLayout &DL,
|
||||
llvm::Align InAlign = llvm::Align(1));
|
||||
|
||||
private:
|
||||
/// Private state for PrintSpecial()
|
||||
|
@ -159,31 +159,31 @@ static gcp_map_type &getGCMap(void *&P) {
|
||||
return *(gcp_map_type*)P;
|
||||
}
|
||||
|
||||
/// getGVAlignmentLog2 - Return the alignment to use for the specified global
|
||||
/// value in log2 form. This rounds up to the preferred alignment if possible
|
||||
/// and legal.
|
||||
unsigned AsmPrinter::getGVAlignmentLog2(const GlobalValue *GV,
|
||||
const DataLayout &DL,
|
||||
unsigned InBits) {
|
||||
unsigned NumBits = 0;
|
||||
/// getGVAlignment - Return the alignment to use for the specified global
|
||||
/// value. This rounds up to the preferred alignment if possible and legal.
|
||||
llvm::Align AsmPrinter::getGVAlignment(const GlobalValue *GV,
|
||||
const DataLayout &DL,
|
||||
llvm::Align InAlign) {
|
||||
llvm::Align Align;
|
||||
if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
|
||||
NumBits = DL.getPreferredAlignmentLog(GVar);
|
||||
Align = llvm::Align(DL.getPreferredAlignment(GVar));
|
||||
|
||||
// If InBits is specified, round it to it.
|
||||
if (InBits > NumBits)
|
||||
NumBits = InBits;
|
||||
// If InAlign is specified, round it to it.
|
||||
if (InAlign > Align)
|
||||
Align = InAlign;
|
||||
|
||||
// If the GV has a specified alignment, take it into account.
|
||||
if (GV->getAlignment() == 0)
|
||||
return NumBits;
|
||||
const llvm::MaybeAlign GVAlign(GV->getAlignment());
|
||||
if (!GVAlign)
|
||||
return Align;
|
||||
|
||||
unsigned GVAlign = Log2_32(GV->getAlignment());
|
||||
assert(GVAlign && "GVAlign must be set");
|
||||
|
||||
// If the GVAlign is larger than NumBits, or if we are required to obey
|
||||
// NumBits because the GV has an assigned section, obey it.
|
||||
if (GVAlign > NumBits || GV->hasSection())
|
||||
NumBits = GVAlign;
|
||||
return NumBits;
|
||||
if (*GVAlign > Align || GV->hasSection())
|
||||
Align = *GVAlign;
|
||||
return Align;
|
||||
}
|
||||
|
||||
AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
|
||||
@ -502,7 +502,7 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
// If the alignment is specified, we *must* obey it. Overaligning a global
|
||||
// with a specified alignment is a prompt way to break globals emitted to
|
||||
// sections and expected to be contiguous (e.g. ObjC metadata).
|
||||
unsigned AlignLog = getGVAlignmentLog2(GV, DL);
|
||||
const llvm::Align Align = getGVAlignment(GV, DL);
|
||||
|
||||
for (const HandlerInfo &HI : Handlers) {
|
||||
NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
|
||||
@ -514,12 +514,11 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
// Handle common symbols
|
||||
if (GVKind.isCommon()) {
|
||||
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
|
||||
unsigned Align = 1 << AlignLog;
|
||||
if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
|
||||
Align = 0;
|
||||
|
||||
// .comm _foo, 42, 4
|
||||
OutStreamer->EmitCommonSymbol(GVSym, Size, Align);
|
||||
const bool SupportsAlignment =
|
||||
getObjFileLowering().getCommDirectiveSupportsAlignment();
|
||||
OutStreamer->EmitCommonSymbol(GVSym, Size,
|
||||
SupportsAlignment ? Align.value() : 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -532,10 +531,9 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
TheSection->isVirtualSection()) {
|
||||
if (Size == 0)
|
||||
Size = 1; // zerofill of 0 bytes is undefined.
|
||||
unsigned Align = 1 << AlignLog;
|
||||
EmitLinkage(GV, GVSym);
|
||||
// .zerofill __DATA, __bss, _foo, 400, 5
|
||||
OutStreamer->EmitZerofill(TheSection, GVSym, Size, Align);
|
||||
OutStreamer->EmitZerofill(TheSection, GVSym, Size, Align.value());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -545,7 +543,6 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
getObjFileLowering().getBSSSection() == TheSection) {
|
||||
if (Size == 0)
|
||||
Size = 1; // .comm Foo, 0 is undefined, avoid it.
|
||||
unsigned Align = 1 << AlignLog;
|
||||
|
||||
// Use .lcomm only if it supports user-specified alignment.
|
||||
// Otherwise, while it would still be correct to use .lcomm in some
|
||||
@ -555,17 +552,17 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
// Prefer to simply fall back to .local / .comm in this case.
|
||||
if (MAI->getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
|
||||
// .lcomm _foo, 42
|
||||
OutStreamer->EmitLocalCommonSymbol(GVSym, Size, Align);
|
||||
OutStreamer->EmitLocalCommonSymbol(GVSym, Size, Align.value());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
|
||||
Align = 0;
|
||||
|
||||
// .local _foo
|
||||
OutStreamer->EmitSymbolAttribute(GVSym, MCSA_Local);
|
||||
// .comm _foo, 42, 4
|
||||
OutStreamer->EmitCommonSymbol(GVSym, Size, Align);
|
||||
const bool SupportsAlignment =
|
||||
getObjFileLowering().getCommDirectiveSupportsAlignment();
|
||||
OutStreamer->EmitCommonSymbol(GVSym, Size,
|
||||
SupportsAlignment ? Align.value() : 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -586,11 +583,11 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
|
||||
if (GVKind.isThreadBSS()) {
|
||||
TheSection = getObjFileLowering().getTLSBSSSection();
|
||||
OutStreamer->EmitTBSSSymbol(TheSection, MangSym, Size, 1 << AlignLog);
|
||||
OutStreamer->EmitTBSSSymbol(TheSection, MangSym, Size, Align.value());
|
||||
} else if (GVKind.isThreadData()) {
|
||||
OutStreamer->SwitchSection(TheSection);
|
||||
|
||||
EmitAlignment(AlignLog, GV);
|
||||
EmitAlignment(Align, GV);
|
||||
OutStreamer->EmitLabel(MangSym);
|
||||
|
||||
EmitGlobalConstant(GV->getParent()->getDataLayout(),
|
||||
@ -626,7 +623,7 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
OutStreamer->SwitchSection(TheSection);
|
||||
|
||||
EmitLinkage(GV, EmittedInitSym);
|
||||
EmitAlignment(AlignLog, GV);
|
||||
EmitAlignment(Align, GV);
|
||||
|
||||
OutStreamer->EmitLabel(EmittedInitSym);
|
||||
|
||||
@ -667,7 +664,7 @@ void AsmPrinter::EmitFunctionHeader() {
|
||||
|
||||
EmitLinkage(&F, CurrentFnSym);
|
||||
if (MAI->hasFunctionAlignment())
|
||||
EmitAlignment(Log2(MF->getAlignment()), &F);
|
||||
EmitAlignment(MF->getAlignment(), &F);
|
||||
|
||||
if (MAI->hasDotTypeDotSizeDirective())
|
||||
OutStreamer->EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
||||
@ -1421,7 +1418,7 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
OutStreamer->SwitchSection(TLOF.getDataSection());
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
|
||||
EmitAlignment(Log2_32(DL.getPointerSize()));
|
||||
EmitAlignment(llvm::Align(DL.getPointerSize()));
|
||||
for (const auto &Stub : Stubs) {
|
||||
OutStreamer->EmitLabel(Stub.first);
|
||||
OutStreamer->EmitSymbolValue(Stub.second.getPointer(),
|
||||
@ -1448,7 +1445,7 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
COFF::IMAGE_SCN_LNK_COMDAT,
|
||||
SectionKind::getReadOnly(), Stub.first->getName(),
|
||||
COFF::IMAGE_COMDAT_SELECT_ANY));
|
||||
EmitAlignment(Log2_32(DL.getPointerSize()));
|
||||
EmitAlignment(llvm::Align(DL.getPointerSize()));
|
||||
OutStreamer->EmitSymbolAttribute(Stub.first, MCSA_Global);
|
||||
OutStreamer->EmitLabel(Stub.first);
|
||||
OutStreamer->EmitSymbolValue(Stub.second.getPointer(),
|
||||
@ -1730,7 +1727,7 @@ void AsmPrinter::EmitConstantPool() {
|
||||
|
||||
if (CurSection != CPSections[i].S) {
|
||||
OutStreamer->SwitchSection(CPSections[i].S);
|
||||
EmitAlignment(Log2_32(CPSections[i].Alignment));
|
||||
EmitAlignment(llvm::Align(CPSections[i].Alignment));
|
||||
CurSection = CPSections[i].S;
|
||||
Offset = 0;
|
||||
}
|
||||
@ -1777,7 +1774,7 @@ void AsmPrinter::EmitJumpTableInfo() {
|
||||
OutStreamer->SwitchSection(ReadOnlySection);
|
||||
}
|
||||
|
||||
EmitAlignment(Log2_32(MJTI->getEntryAlignment(DL)));
|
||||
EmitAlignment(llvm::Align(MJTI->getEntryAlignment(DL)));
|
||||
|
||||
// Jump tables in code sections are marked with a data_region directive
|
||||
// where that's supported.
|
||||
@ -1990,7 +1987,7 @@ void AsmPrinter::EmitXXStructorList(const DataLayout &DL, const Constant *List,
|
||||
}
|
||||
|
||||
// Emit the function pointers in the target-specific order
|
||||
unsigned Align = Log2_32(DL.getPointerPrefAlignment());
|
||||
const llvm::Align Align = llvm::Align(DL.getPointerPrefAlignment());
|
||||
llvm::stable_sort(Structors, [](const Structor &L, const Structor &R) {
|
||||
return L.Priority < R.Priority;
|
||||
});
|
||||
@ -2114,23 +2111,21 @@ void AsmPrinter::EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// EmitAlignment - Emit an alignment directive to the specified power of
|
||||
// two boundary. For example, if you pass in 3 here, you will get an 8
|
||||
// byte alignment. If a global value is specified, and if that global has
|
||||
// two boundary. If a global value is specified, and if that global has
|
||||
// an explicit alignment requested, it will override the alignment request
|
||||
// if required for correctness.
|
||||
void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalObject *GV) const {
|
||||
void AsmPrinter::EmitAlignment(llvm::Align Align,
|
||||
const GlobalObject *GV) const {
|
||||
if (GV)
|
||||
NumBits = getGVAlignmentLog2(GV, GV->getParent()->getDataLayout(), NumBits);
|
||||
Align = getGVAlignment(GV, GV->getParent()->getDataLayout(), Align);
|
||||
|
||||
if (NumBits == 0) return; // 1-byte aligned: no need to emit alignment.
|
||||
if (Align == 1)
|
||||
return; // 1-byte aligned: no need to emit alignment.
|
||||
|
||||
assert(NumBits <
|
||||
static_cast<unsigned>(std::numeric_limits<unsigned>::digits) &&
|
||||
"undefined behavior");
|
||||
if (getCurrentSection()->getKind().isText())
|
||||
OutStreamer->EmitCodeAlignment(1u << NumBits);
|
||||
OutStreamer->EmitCodeAlignment(Align.value());
|
||||
else
|
||||
OutStreamer->EmitValueToAlignment(1u << NumBits);
|
||||
OutStreamer->EmitValueToAlignment(Align.value());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -2905,8 +2900,9 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) {
|
||||
}
|
||||
|
||||
// Emit an alignment directive for this block, if needed.
|
||||
if (unsigned LogAlign = MBB.getLogAlignment())
|
||||
EmitAlignment(LogAlign);
|
||||
const llvm::Align Align = MBB.getAlignment();
|
||||
if (Align > 1)
|
||||
EmitAlignment(Align);
|
||||
MCCodePaddingContext Context;
|
||||
setupCodePaddingContext(MBB, Context);
|
||||
OutStreamer->EmitCodePaddingBasicBlockStart(Context);
|
||||
|
@ -426,7 +426,7 @@ MCSymbol *EHStreamer::emitExceptionTable() {
|
||||
// EHABI). In this case LSDASection will be NULL.
|
||||
if (LSDASection)
|
||||
Asm->OutStreamer->SwitchSection(LSDASection);
|
||||
Asm->EmitAlignment(2);
|
||||
Asm->EmitAlignment(llvm::Align(4));
|
||||
|
||||
// Emit the LSDA.
|
||||
MCSymbol *GCCETSym =
|
||||
@ -602,11 +602,11 @@ MCSymbol *EHStreamer::emitExceptionTable() {
|
||||
}
|
||||
|
||||
if (HaveTTData) {
|
||||
Asm->EmitAlignment(2);
|
||||
Asm->EmitAlignment(llvm::Align(4));
|
||||
emitTypeInfos(TTypeEncoding, TTBaseLabel);
|
||||
}
|
||||
|
||||
Asm->EmitAlignment(2);
|
||||
Asm->EmitAlignment(llvm::Align(4));
|
||||
return GCCETSym;
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,7 @@ void ErlangGCPrinter::finishAssembly(Module &M, GCModuleInfo &Info,
|
||||
**/
|
||||
|
||||
// Align to address width.
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? llvm::Align(4) : llvm::Align(8));
|
||||
|
||||
// Emit PointCount.
|
||||
OS.AddComment("safe point count");
|
||||
|
@ -129,7 +129,7 @@ void OcamlGCMetadataPrinter::finishAssembly(Module &M, GCModuleInfo &Info,
|
||||
report_fatal_error(" Too much descriptor for ocaml GC");
|
||||
}
|
||||
AP.emitInt16(NumDescriptors);
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? llvm::Align(4) : llvm::Align(8));
|
||||
|
||||
for (GCModuleInfo::FuncInfoVec::iterator I = Info.funcinfo_begin(),
|
||||
IE = Info.funcinfo_end();
|
||||
@ -180,7 +180,7 @@ void OcamlGCMetadataPrinter::finishAssembly(Module &M, GCModuleInfo &Info,
|
||||
AP.emitInt16(K->StackOffset);
|
||||
}
|
||||
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
|
||||
AP.EmitAlignment(IntPtrSize == 4 ? llvm::Align(4) : llvm::Align(8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -203,8 +203,8 @@ void WinException::beginFunclet(const MachineBasicBlock &MBB,
|
||||
|
||||
// We want our funclet's entry point to be aligned such that no nops will be
|
||||
// present after the label.
|
||||
Asm->EmitAlignment(
|
||||
Log2(std::max(Asm->MF->getAlignment(), MBB.getAlignment())), &F);
|
||||
Asm->EmitAlignment(std::max(Asm->MF->getAlignment(), MBB.getAlignment()),
|
||||
&F);
|
||||
|
||||
// Now that we've emitted the alignment directive, point at our funclet.
|
||||
Asm->OutStreamer->EmitLabel(Sym);
|
||||
|
@ -692,7 +692,7 @@ void AArch64AsmPrinter::EmitJumpTableInfo() {
|
||||
if (JTBBs.empty()) continue;
|
||||
|
||||
unsigned Size = AFI->getJumpTableEntrySize(JTI);
|
||||
EmitAlignment(Log2_32(Size));
|
||||
EmitAlignment(llvm::Align(Size));
|
||||
OutStreamer->EmitLabel(GetJTISymbol(JTI));
|
||||
|
||||
for (auto *JTBB : JTBBs)
|
||||
|
@ -168,7 +168,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
// relatively easy to exceed the thumb branch range within a TU.
|
||||
if (! ThumbIndirectPads.empty()) {
|
||||
OutStreamer->EmitAssemblerFlag(MCAF_Code16);
|
||||
EmitAlignment(1);
|
||||
EmitAlignment(llvm::Align(2));
|
||||
for (std::pair<unsigned, MCSymbol *> &TIP : ThumbIndirectPads) {
|
||||
OutStreamer->EmitLabel(TIP.second);
|
||||
EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tBX)
|
||||
@ -526,7 +526,7 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
if (!Stubs.empty()) {
|
||||
// Switch with ".non_lazy_symbol_pointer" directive.
|
||||
OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
|
||||
EmitAlignment(2);
|
||||
EmitAlignment(llvm::Align(4));
|
||||
|
||||
for (auto &Stub : Stubs)
|
||||
emitNonLazySymbolPointer(*OutStreamer, Stub.first, Stub.second);
|
||||
@ -539,7 +539,7 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
if (!Stubs.empty()) {
|
||||
// Switch with ".non_lazy_symbol_pointer" directive.
|
||||
OutStreamer->SwitchSection(TLOFMacho.getThreadLocalPointerSection());
|
||||
EmitAlignment(2);
|
||||
EmitAlignment(llvm::Align(4));
|
||||
|
||||
for (auto &Stub : Stubs)
|
||||
emitNonLazySymbolPointer(*OutStreamer, Stub.first, Stub.second);
|
||||
@ -940,7 +940,7 @@ void ARMAsmPrinter::EmitJumpTableAddrs(const MachineInstr *MI) {
|
||||
|
||||
// Make sure the Thumb jump table is 4-byte aligned. This will be a nop for
|
||||
// ARM mode tables.
|
||||
EmitAlignment(2);
|
||||
EmitAlignment(llvm::Align(4));
|
||||
|
||||
// Emit a label for the jump table.
|
||||
MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
|
||||
@ -986,7 +986,7 @@ void ARMAsmPrinter::EmitJumpTableInsts(const MachineInstr *MI) {
|
||||
|
||||
// Make sure the Thumb jump table is 4-byte aligned. This will be a nop for
|
||||
// ARM mode tables.
|
||||
EmitAlignment(2);
|
||||
EmitAlignment(llvm::Align(4));
|
||||
|
||||
// Emit a label for the jump table.
|
||||
MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
|
||||
@ -1015,7 +1015,7 @@ void ARMAsmPrinter::EmitJumpTableTBInst(const MachineInstr *MI,
|
||||
unsigned JTI = MO1.getIndex();
|
||||
|
||||
if (Subtarget->isThumb1Only())
|
||||
EmitAlignment(2);
|
||||
EmitAlignment(llvm::Align(4));
|
||||
|
||||
MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
|
||||
OutStreamer->EmitLabel(JTISymbol);
|
||||
@ -1058,7 +1058,7 @@ void ARMAsmPrinter::EmitJumpTableTBInst(const MachineInstr *MI,
|
||||
OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
|
||||
|
||||
// Make sure the next instruction is 2-byte aligned.
|
||||
EmitAlignment(1);
|
||||
EmitAlignment(llvm::Align(2));
|
||||
}
|
||||
|
||||
void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
|
||||
|
@ -10,11 +10,12 @@
|
||||
#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCNACL_H
|
||||
|
||||
#include "llvm/MC/MCELFStreamer.h"
|
||||
#include "llvm/Support/Alignment.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
// Log2 of the NaCl MIPS sandbox's instruction bundle size.
|
||||
static const unsigned MIPS_NACL_BUNDLE_LOG_ALIGN = 4u;
|
||||
// NaCl MIPS sandbox's instruction bundle size.
|
||||
static const llvm::Align MIPS_NACL_BUNDLE_ALIGN = llvm::Align(16);
|
||||
|
||||
bool isBasePlusOffsetMemoryAccess(unsigned Opcode, unsigned *AddrIdx,
|
||||
bool *IsStore = nullptr);
|
||||
|
@ -270,7 +270,7 @@ MCELFStreamer *createMipsNaClELFStreamer(MCContext &Context,
|
||||
S->getAssembler().setRelaxAll(true);
|
||||
|
||||
// Set bundle-alignment as required by the NaCl ABI for the target.
|
||||
S->EmitBundleAlignMode(MIPS_NACL_BUNDLE_LOG_ALIGN);
|
||||
S->EmitBundleAlignMode(Log2(MIPS_NACL_BUNDLE_ALIGN));
|
||||
|
||||
return S;
|
||||
}
|
||||
|
@ -400,8 +400,7 @@ void MipsAsmPrinter::EmitFunctionEntryLabel() {
|
||||
// NaCl sandboxing requires that indirect call instructions are masked.
|
||||
// This means that function entry points should be bundle-aligned.
|
||||
if (Subtarget->isTargetNaCl())
|
||||
EmitAlignment(
|
||||
std::max(Log2(MF->getAlignment()), MIPS_NACL_BUNDLE_LOG_ALIGN));
|
||||
EmitAlignment(std::max(MF->getAlignment(), MIPS_NACL_BUNDLE_ALIGN));
|
||||
|
||||
if (Subtarget->inMicroMipsMode()) {
|
||||
TS.emitDirectiveSetMicroMips();
|
||||
@ -1279,14 +1278,14 @@ void MipsAsmPrinter::NaClAlignIndirectJumpTargets(MachineFunction &MF) {
|
||||
const std::vector<MachineBasicBlock*> &MBBs = JT[I].MBBs;
|
||||
|
||||
for (unsigned J = 0; J < MBBs.size(); ++J)
|
||||
MBBs[J]->setLogAlignment(MIPS_NACL_BUNDLE_LOG_ALIGN);
|
||||
MBBs[J]->setAlignment(MIPS_NACL_BUNDLE_ALIGN);
|
||||
}
|
||||
}
|
||||
|
||||
// If basic block address is taken, block can be target of indirect branch.
|
||||
for (auto &MBB : MF) {
|
||||
if (MBB.hasAddressTaken())
|
||||
MBB.setLogAlignment(MIPS_NACL_BUNDLE_LOG_ALIGN);
|
||||
MBB.setAlignment(MIPS_NACL_BUNDLE_ALIGN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -507,7 +507,7 @@ void MipsBranchExpansion::expandToLongBranch(MBBInfo &I) {
|
||||
.addImm(0);
|
||||
if (STI->isTargetNaCl())
|
||||
// Bundle-align the target of indirect branch JR.
|
||||
TgtMBB->setLogAlignment(MIPS_NACL_BUNDLE_LOG_ALIGN);
|
||||
TgtMBB->setAlignment(MIPS_NACL_BUNDLE_ALIGN);
|
||||
|
||||
// In NaCl, modifying the sp is not allowed in branch delay slot.
|
||||
// For MIPS32R6, we can skip using a delay slot branch.
|
||||
|
@ -1607,7 +1607,7 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
|
||||
if (!Stubs.empty()) {
|
||||
// Switch with ".non_lazy_symbol_pointer" directive.
|
||||
OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
|
||||
EmitAlignment(isPPC64 ? 3 : 2);
|
||||
EmitAlignment(isPPC64 ? llvm::Align(8) : llvm::Align(4));
|
||||
|
||||
for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
|
||||
// L_foo$stub:
|
||||
@ -1690,12 +1690,9 @@ void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the alignment in the log2 form.
|
||||
const unsigned AlignLog = getGVAlignmentLog2(GV, DL);
|
||||
|
||||
MCSymbol *EmittedInitSym = GVSym;
|
||||
EmitLinkage(GV, EmittedInitSym);
|
||||
EmitAlignment(AlignLog, GV);
|
||||
EmitAlignment(getGVAlignment(GV, DL), GV);
|
||||
OutStreamer->EmitLabel(EmittedInitSym);
|
||||
EmitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer());
|
||||
}
|
||||
|
@ -575,7 +575,7 @@ void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
|
||||
// Emitting note header.
|
||||
int WordSize = TT.isArch64Bit() ? 8 : 4;
|
||||
EmitAlignment(WordSize == 4 ? 2 : 3);
|
||||
EmitAlignment(WordSize == 4 ? llvm::Align(4) : llvm::Align(8));
|
||||
OutStreamer->EmitIntValue(4, 4 /*size*/); // data size for "GNU\0"
|
||||
OutStreamer->EmitIntValue(8 + WordSize, 4 /*size*/); // Elf_Prop size
|
||||
OutStreamer->EmitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4 /*size*/);
|
||||
@ -585,7 +585,7 @@ void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
OutStreamer->EmitIntValue(ELF::GNU_PROPERTY_X86_FEATURE_1_AND, 4);
|
||||
OutStreamer->EmitIntValue(4, 4); // data size
|
||||
OutStreamer->EmitIntValue(FeatureFlagsAnd, 4); // data
|
||||
EmitAlignment(WordSize == 4 ? 2 : 3); // padding
|
||||
EmitAlignment(WordSize == 4 ? llvm::Align(4) : llvm::Align(8)); // padding
|
||||
|
||||
OutStreamer->endSection(Nt);
|
||||
OutStreamer->SwitchSection(Cur);
|
||||
|
@ -115,7 +115,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
|
||||
MCSymbol *GVSym = getSymbol(GV);
|
||||
const Constant *C = GV->getInitializer();
|
||||
unsigned Align = Log2_32(DL.getPrefTypeAlignment(C->getType()));
|
||||
const llvm::Align Align(DL.getPrefTypeAlignment(C->getType()));
|
||||
|
||||
// Mark the start of the global
|
||||
getTargetStreamer().emitCCTopData(GVSym->getName());
|
||||
@ -143,7 +143,7 @@ void XCoreAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
llvm_unreachable("Unknown linkage type!");
|
||||
}
|
||||
|
||||
EmitAlignment(Align > 2 ? Align : 2, GV);
|
||||
EmitAlignment(std::max(Align, llvm::Align(4)), GV);
|
||||
|
||||
if (GV->isThreadLocal()) {
|
||||
report_fatal_error("TLS is not supported by this target!");
|
||||
|
Loading…
x
Reference in New Issue
Block a user