Keep it optional in cases this is ever needed in some global context. Currently it's only used for getting an upper bound inline asm code size. For AMDGPU, gfx10 increases the maximum instruction size to 20-bytes. This avoids penalizing older subtargets when estimating code size, and making some annoying branch relaxation test adjustments. llvm-svn: 361405
67 lines
2.3 KiB
C++
67 lines
2.3 KiB
C++
//===-- MCTargetDesc/AMDGPUMCAsmInfo.cpp - Assembly Info ------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
/// \file
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "AMDGPUMCAsmInfo.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
|
|
|
using namespace llvm;
|
|
|
|
AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(const Triple &TT) : MCAsmInfoELF() {
|
|
CodePointerSize = (TT.getArch() == Triple::amdgcn) ? 8 : 4;
|
|
StackGrowsUp = true;
|
|
HasSingleParameterDotFile = false;
|
|
//===------------------------------------------------------------------===//
|
|
MinInstAlignment = 4;
|
|
|
|
// This is the maximum instruction encoded size for gfx10. With a known
|
|
// subtarget, it can be reduced to 8 bytes.
|
|
MaxInstLength = (TT.getArch() == Triple::amdgcn) ? 20 : 16;
|
|
SeparatorString = "\n";
|
|
CommentString = ";";
|
|
PrivateLabelPrefix = "";
|
|
InlineAsmStart = ";#ASMSTART";
|
|
InlineAsmEnd = ";#ASMEND";
|
|
|
|
//===--- Data Emission Directives -------------------------------------===//
|
|
SunStyleELFSectionSwitchSyntax = true;
|
|
UsesELFSectionDirectiveForBSS = true;
|
|
|
|
//===--- Global Variable Emission Directives --------------------------===//
|
|
HasAggressiveSymbolFolding = true;
|
|
COMMDirectiveAlignmentIsInBytes = false;
|
|
HasNoDeadStrip = true;
|
|
WeakRefDirective = ".weakref\t";
|
|
//===--- Dwarf Emission Directives -----------------------------------===//
|
|
SupportsDebugInformation = true;
|
|
}
|
|
|
|
bool AMDGPUMCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {
|
|
return SectionName == ".hsatext" || SectionName == ".hsadata_global_agent" ||
|
|
SectionName == ".hsadata_global_program" ||
|
|
SectionName == ".hsarodata_readonly_agent" ||
|
|
MCAsmInfo::shouldOmitSectionDirective(SectionName);
|
|
}
|
|
|
|
unsigned AMDGPUMCAsmInfo::getMaxInstLength(const MCSubtargetInfo *STI) const {
|
|
if (!STI || STI->getTargetTriple().getArch() == Triple::r600)
|
|
return MaxInstLength;
|
|
|
|
// Maximum for NSA encoded images
|
|
if (STI->getFeatureBits()[AMDGPU::FeatureNSAEncoding])
|
|
return 20;
|
|
|
|
// 64-bit instruction with 32-bit literal.
|
|
if (STI->getFeatureBits()[AMDGPU::FeatureVOP3Literal])
|
|
return 12;
|
|
|
|
return 8;
|
|
}
|