Rewrite ARM execute only support to avoid the use of a command line flag and unqualified ARMSubtarget lookup.
Paired with a clang commit to use the new behavior. llvm-svn: 306927
This commit is contained in:
parent
96b4164968
commit
015dc2094e
|
@ -269,6 +269,10 @@ def FeatureLongCalls : SubtargetFeature<"long-calls", "GenLongCalls", "true",
|
|||
"Generate calls via indirect call "
|
||||
"instructions">;
|
||||
|
||||
def FeatureExecuteOnly
|
||||
: SubtargetFeature<"execute-only", "GenExecuteOnly", "true",
|
||||
"Enable the generation of execute only code.">;
|
||||
|
||||
def FeatureReserveR9 : SubtargetFeature<"reserve-r9", "ReserveR9", "true",
|
||||
"Reserve R9, making it unavailable as "
|
||||
"GPR">;
|
||||
|
|
|
@ -92,11 +92,6 @@ ARMSubtarget &ARMSubtarget::initializeSubtargetDependencies(StringRef CPU,
|
|||
return *this;
|
||||
}
|
||||
|
||||
/// EnableExecuteOnly - Enables the generation of execute-only code on supported
|
||||
/// targets
|
||||
static cl::opt<bool>
|
||||
EnableExecuteOnly("arm-execute-only");
|
||||
|
||||
ARMFrameLowering *ARMSubtarget::initializeFrameLowering(StringRef CPU,
|
||||
StringRef FS) {
|
||||
ARMSubtarget &STI = initializeSubtargetDependencies(CPU, FS);
|
||||
|
@ -139,9 +134,8 @@ ARMSubtarget::ARMSubtarget(const Triple &TT, const std::string &CPU,
|
|||
const std::string &FS,
|
||||
const ARMBaseTargetMachine &TM, bool IsLittle)
|
||||
: ARMGenSubtargetInfo(TT, CPU, FS), UseMulOps(UseFusedMulOps),
|
||||
GenExecuteOnly(EnableExecuteOnly), CPUString(CPU), IsLittle(IsLittle),
|
||||
TargetTriple(TT), Options(TM.Options), TM(TM),
|
||||
FrameLowering(initializeFrameLowering(CPU, FS)),
|
||||
CPUString(CPU), IsLittle(IsLittle), TargetTriple(TT), Options(TM.Options),
|
||||
TM(TM), FrameLowering(initializeFrameLowering(CPU, FS)),
|
||||
// At this point initializeSubtargetDependencies has been called so
|
||||
// we can query directly.
|
||||
InstrInfo(isThumb1Only()
|
||||
|
|
|
@ -32,7 +32,7 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
|
|||
const TargetMachine &TM) {
|
||||
const ARMBaseTargetMachine &ARM_TM = static_cast<const ARMBaseTargetMachine &>(TM);
|
||||
bool isAAPCS_ABI = ARM_TM.TargetABI == ARMBaseTargetMachine::ARMABI::ARM_ABI_AAPCS;
|
||||
genExecuteOnly = ARM_TM.getSubtargetImpl()->genExecuteOnly();
|
||||
// genExecuteOnly = ARM_TM.getSubtargetImpl()->genExecuteOnly();
|
||||
|
||||
TargetLoweringObjectFileELF::Initialize(Ctx, TM);
|
||||
InitializeELF(isAAPCS_ABI);
|
||||
|
@ -43,16 +43,6 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
|
|||
|
||||
AttributesSection =
|
||||
getContext().getELFSection(".ARM.attributes", ELF::SHT_ARM_ATTRIBUTES, 0);
|
||||
|
||||
// Make code section unreadable when in execute-only mode
|
||||
if (genExecuteOnly) {
|
||||
unsigned Type = ELF::SHT_PROGBITS;
|
||||
unsigned Flags = ELF::SHF_EXECINSTR | ELF::SHF_ALLOC | ELF::SHF_ARM_PURECODE;
|
||||
// Since we cannot modify flags for an existing section, we create a new
|
||||
// section with the right flags, and use 0 as the unique ID for
|
||||
// execute-only text
|
||||
TextSection = Ctx.getELFSection(".text", Type, Flags, 0, "", 0U);
|
||||
}
|
||||
}
|
||||
|
||||
const MCExpr *ARMElfTargetObjectFile::getTTypeGlobalReference(
|
||||
|
@ -74,21 +64,27 @@ getDebugThreadLocalSymbol(const MCSymbol *Sym) const {
|
|||
getContext());
|
||||
}
|
||||
|
||||
MCSection *
|
||||
ARMElfTargetObjectFile::getExplicitSectionGlobal(const GlobalObject *GO,
|
||||
SectionKind SK, const TargetMachine &TM) const {
|
||||
static bool isExecuteOnlyFunction(const GlobalObject *GO, SectionKind SK,
|
||||
const TargetMachine &TM) {
|
||||
if (const Function *F = dyn_cast<Function>(GO))
|
||||
if (TM.getSubtarget<ARMSubtarget>(*F).genExecuteOnly() && SK.isText())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
MCSection *ARMElfTargetObjectFile::getExplicitSectionGlobal(
|
||||
const GlobalObject *GO, SectionKind SK, const TargetMachine &TM) const {
|
||||
// Set execute-only access for the explicit section
|
||||
if (genExecuteOnly && SK.isText())
|
||||
if (isExecuteOnlyFunction(GO, SK, TM))
|
||||
SK = SectionKind::getExecuteOnly();
|
||||
|
||||
return TargetLoweringObjectFileELF::getExplicitSectionGlobal(GO, SK, TM);
|
||||
}
|
||||
|
||||
MCSection *
|
||||
ARMElfTargetObjectFile::SelectSectionForGlobal(const GlobalObject *GO,
|
||||
SectionKind SK, const TargetMachine &TM) const {
|
||||
MCSection *ARMElfTargetObjectFile::SelectSectionForGlobal(
|
||||
const GlobalObject *GO, SectionKind SK, const TargetMachine &TM) const {
|
||||
// Place the global in the execute-only text section
|
||||
if (genExecuteOnly && SK.isText())
|
||||
if (isExecuteOnlyFunction(GO, SK, TM))
|
||||
SK = SectionKind::getExecuteOnly();
|
||||
|
||||
return TargetLoweringObjectFileELF::SelectSectionForGlobal(GO, SK, TM);
|
||||
|
|
|
@ -16,8 +16,6 @@
|
|||
namespace llvm {
|
||||
|
||||
class ARMElfTargetObjectFile : public TargetLoweringObjectFileELF {
|
||||
mutable bool genExecuteOnly = false;
|
||||
|
||||
protected:
|
||||
const MCSection *AttributesSection = nullptr;
|
||||
|
||||
|
|
|
@ -5,25 +5,25 @@
|
|||
; RUN: llc -mtriple=thumbv7m -mcpu=cortex-m4 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-NO-XO %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv7m -arm-execute-only -mcpu=cortex-m4 %s -o - \
|
||||
; RUN: llc -mtriple=thumbv7m -mattr=+execute-only -mcpu=cortex-m4 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-FLOAT --check-prefix=CHECK-XO-DOUBLE %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv7meb -arm-execute-only -mcpu=cortex-m4 %s -o - \
|
||||
; RUN: llc -mtriple=thumbv7meb -mattr=+execute-only -mcpu=cortex-m4 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-FLOAT --check-prefix=CHECK-XO-DOUBLE-BE %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv7m -arm-execute-only -mcpu=cortex-m4 -relocation-model=ropi %s -o - \
|
||||
; RUN: llc -mtriple=thumbv7m -mattr=+execute-only -mcpu=cortex-m4 -relocation-model=ropi %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-ROPI %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv8m.main -mattr=fp-armv8 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-NO-XO %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv8m.main -arm-execute-only -mattr=fp-armv8 %s -o - \
|
||||
; RUN: llc -mtriple=thumbv8m.main -mattr=+execute-only -mattr=fp-armv8 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-FLOAT --check-prefix=CHECK-XO-DOUBLE %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv8m.maineb -arm-execute-only -mattr=fp-armv8 %s -o - \
|
||||
; RUN: llc -mtriple=thumbv8m.maineb -mattr=+execute-only -mattr=fp-armv8 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-FLOAT --check-prefix=CHECK-XO-DOUBLE-BE %s
|
||||
|
||||
; RUN: llc -mtriple=thumbv8m.main -arm-execute-only -mattr=fp-armv8 -relocation-model=ropi %s -o - \
|
||||
; RUN: llc -mtriple=thumbv8m.main -mattr=+execute-only -mattr=fp-armv8 -relocation-model=ropi %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-XO-ROPI %s
|
||||
|
||||
define arm_aapcs_vfpcc float @test_vmov_f32() {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
; RUN: llc < %s -mtriple=thumbv7m -arm-execute-only -O0 %s -o - \
|
||||
; RUN: llc < %s -mtriple=thumbv7m -mattr=+execute-only -O0 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-SUBW-ADDW %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.base -arm-execute-only -O0 %s -o - \
|
||||
; RUN: llc < %s -mtriple=thumbv8m.base -mattr=+execute-only -O0 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-MOVW-MOVT-ADD %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.main -arm-execute-only -O0 %s -o - \
|
||||
; RUN: llc < %s -mtriple=thumbv8m.main -mattr=+execute-only -O0 %s -o - \
|
||||
; RUN: | FileCheck --check-prefix=CHECK-SUBW-ADDW %s
|
||||
|
||||
define i8 @test_big_stack_frame() {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -mtriple=thumbv7m -arm-execute-only %s -o - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.base -arm-execute-only %s -o - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.main -arm-execute-only %s -o - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv7m -mattr=+execute-only %s -o - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.base -mattr=+execute-only %s -o - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv8m.main -mattr=+execute-only %s -o - | FileCheck %s
|
||||
|
||||
; CHECK: .section .text,"axy",%progbits,unique,0
|
||||
; CHECK-NOT: .section
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc -mtriple=thumbv8m.base-eabi -arm-execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2BASE %s
|
||||
; RUN: llc -mtriple=thumbv7m-eabi -arm-execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2 %s
|
||||
; RUN: llc -mtriple=thumbv8m.main-eabi -arm-execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2 %s
|
||||
; RUN: llc -mtriple=thumbv8m.base-eabi -mattr=+execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2BASE %s
|
||||
; RUN: llc -mtriple=thumbv7m-eabi -mattr=+execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2 %s
|
||||
; RUN: llc -mtriple=thumbv8m.main-eabi -mattr=+execute-only %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CHECK-T2 %s
|
||||
|
||||
@var = global i32 0
|
||||
|
||||
|
|
Loading…
Reference in New Issue