mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 19:59:57 +00:00
[ARM] Generate ABI_optimization_goals build attribute, as described in the ARM ARM.
Summary: This reverts r254234, and adds a simple fix for the annoying case of use-after-free. Reviewers: rengolin Subscribers: aemerson, llvm-commits, rengolin Differential Revision: http://reviews.llvm.org/D15236 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254912 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0284291aa1
commit
fad998fc36
@ -60,7 +60,7 @@ using namespace llvm;
|
||||
ARMAsmPrinter::ARMAsmPrinter(TargetMachine &TM,
|
||||
std::unique_ptr<MCStreamer> Streamer)
|
||||
: AsmPrinter(TM, std::move(Streamer)), AFI(nullptr), MCP(nullptr),
|
||||
InConstantPool(false) {}
|
||||
InConstantPool(false), OptimizationGoals(-1) {}
|
||||
|
||||
void ARMAsmPrinter::EmitFunctionBodyEnd() {
|
||||
// Make sure to terminate any constant pools that were at the end
|
||||
@ -106,9 +106,38 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
Subtarget = &MF.getSubtarget<ARMSubtarget>();
|
||||
|
||||
SetupMachineFunction(MF);
|
||||
const Function* F = MF.getFunction();
|
||||
const TargetMachine& TM = MF.getTarget();
|
||||
|
||||
// Calculate this function's optimization goal.
|
||||
unsigned OptimizationGoal;
|
||||
if (F->hasFnAttribute(Attribute::OptimizeNone))
|
||||
// For best debugging illusion, speed and small size sacrificed
|
||||
OptimizationGoal = 6;
|
||||
else if (F->optForMinSize())
|
||||
// Aggressively for small size, speed and debug illusion sacrificed
|
||||
OptimizationGoal = 4;
|
||||
else if (F->optForSize())
|
||||
// For small size, but speed and debugging illusion preserved
|
||||
OptimizationGoal = 3;
|
||||
else if (TM.getOptLevel() == CodeGenOpt::Aggressive)
|
||||
// Aggressively for speed, small size and debug illusion sacrificed
|
||||
OptimizationGoal = 2;
|
||||
else if (TM.getOptLevel() > CodeGenOpt::None)
|
||||
// For speed, but small size and good debug illusion preserved
|
||||
OptimizationGoal = 1;
|
||||
else // TM.getOptLevel() == CodeGenOpt::None
|
||||
// For good debugging, but speed and small size preserved
|
||||
OptimizationGoal = 5;
|
||||
|
||||
// Combine a new optimization goal with existing ones.
|
||||
if (OptimizationGoals == -1) // uninitialized goals
|
||||
OptimizationGoals = OptimizationGoal;
|
||||
else if (OptimizationGoals != (int)OptimizationGoal) // conflicting goals
|
||||
OptimizationGoals = 0;
|
||||
|
||||
if (Subtarget->isTargetCOFF()) {
|
||||
bool Internal = MF.getFunction()->hasInternalLinkage();
|
||||
bool Internal = F->hasInternalLinkage();
|
||||
COFF::SymbolStorageClass Scl = Internal ? COFF::IMAGE_SYM_CLASS_STATIC
|
||||
: COFF::IMAGE_SYM_CLASS_EXTERNAL;
|
||||
int Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT;
|
||||
@ -506,6 +535,16 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
// generates code that does this, it is always safe to set.
|
||||
OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
|
||||
}
|
||||
|
||||
// The last attribute to be emitted is ABI_optimization_goals
|
||||
MCTargetStreamer &TS = *OutStreamer->getTargetStreamer();
|
||||
ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
|
||||
|
||||
if (OptimizationGoals > 0)
|
||||
ATS.emitAttribute(ARMBuildAttrs::ABI_optimization_goals, OptimizationGoals);
|
||||
OptimizationGoals = -1;
|
||||
|
||||
ATS.finishAttributeSection();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -798,8 +837,6 @@ void ARMAsmPrinter::emitAttributes() {
|
||||
else if (STI.hasVirtualization())
|
||||
ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
|
||||
ARMBuildAttrs::AllowVirtualization);
|
||||
|
||||
ATS.finishAttributeSection();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -51,6 +51,11 @@ class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
|
||||
/// labels used for ARMv4t thumb code to make register indirect calls.
|
||||
SmallVector<std::pair<unsigned, MCSymbol*>, 4> ThumbIndirectPads;
|
||||
|
||||
/// OptimizationGoals - Maintain a combined optimization goal for all
|
||||
/// functions in a module: one of Tag_ABI_optimization_goals values,
|
||||
/// -1 if uninitialized, 0 if conflicting goals
|
||||
int OptimizationGoals;
|
||||
|
||||
public:
|
||||
explicit ARMAsmPrinter(TargetMachine &TM,
|
||||
std::unique_ptr<MCStreamer> Streamer);
|
||||
|
@ -79,7 +79,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
|
||||
void emitAttribute(unsigned Attribute, unsigned Value) override;
|
||||
void emitTextAttribute(unsigned Attribute, StringRef String) override;
|
||||
void emitIntTextAttribute(unsigned Attribute, unsigned IntValue,
|
||||
StringRef StrinValue) override;
|
||||
StringRef StringValue) override;
|
||||
void emitArch(unsigned Arch) override;
|
||||
void emitArchExtension(unsigned ArchExt) override;
|
||||
void emitObjectArch(unsigned Arch) override;
|
||||
@ -243,7 +243,7 @@ void ARMTargetAsmStreamer::emitUnwindRaw(int64_t Offset,
|
||||
class ARMTargetELFStreamer : public ARMTargetStreamer {
|
||||
private:
|
||||
// This structure holds all attributes, accounting for
|
||||
// their string/numeric value, so we can later emmit them
|
||||
// their string/numeric value, so we can later emit them
|
||||
// in declaration order, keeping all in the same vector
|
||||
struct AttributeItem {
|
||||
enum {
|
||||
@ -254,7 +254,7 @@ private:
|
||||
} Type;
|
||||
unsigned Tag;
|
||||
unsigned IntValue;
|
||||
StringRef StringValue;
|
||||
std::string StringValue;
|
||||
|
||||
static bool LessTag(const AttributeItem &LHS, const AttributeItem &RHS) {
|
||||
// The conformance tag must be emitted first when serialised
|
||||
|
18
test/CodeGen/ARM/build-attributes-optimization-minsize.ll
Normal file
18
test/CodeGen/ARM/build-attributes-optimization-minsize.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 | FileCheck %s
|
||||
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
|
||||
; CHECK: .eabi_attribute 30, 4 @ Tag_ABI_optimization_goals
|
||||
; CHECK-OBJ: TagName: ABI_optimization_goals
|
||||
; CHECK-OBJ-NEXT: Description: Aggressive Size
|
||||
|
||||
define i32 @f(i64 %z) #0 {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
attributes #0 = { minsize optsize }
|
||||
|
23
test/CodeGen/ARM/build-attributes-optimization-mixed.ll
Normal file
23
test/CodeGen/ARM/build-attributes-optimization-mixed.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 | FileCheck %s
|
||||
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s
|
||||
|
||||
; CHECK-NOT: .eabi_attribute 30
|
||||
; CHECK-NOT: Tag_ABI_optimization_goals
|
||||
|
||||
define i32 @f(i64 %z) #0 {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define i32 @g(i64 %z) #1 {
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
attributes #0 = { noinline optnone }
|
||||
|
||||
attributes #1 = { minsize optsize }
|
||||
|
18
test/CodeGen/ARM/build-attributes-optimization-optnone.ll
Normal file
18
test/CodeGen/ARM/build-attributes-optimization-optnone.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 | FileCheck %s
|
||||
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
|
||||
; CHECK: .eabi_attribute 30, 6 @ Tag_ABI_optimization_goals
|
||||
; CHECK-OBJ: TagName: ABI_optimization_goals
|
||||
; CHECK-OBJ-NEXT: Description: Best Debugging
|
||||
|
||||
define i32 @f(i64 %z) #0 {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
attributes #0 = { noinline optnone }
|
||||
|
18
test/CodeGen/ARM/build-attributes-optimization-optsize.ll
Normal file
18
test/CodeGen/ARM/build-attributes-optimization-optsize.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 | FileCheck %s
|
||||
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=CHECK-OBJ
|
||||
|
||||
; CHECK: .eabi_attribute 30, 3 @ Tag_ABI_optimization_goals
|
||||
; CHECK-OBJ: TagName: ABI_optimization_goals
|
||||
; CHECK-OBJ-NEXT: Description: Size
|
||||
|
||||
define i32 @f(i64 %z) #0 {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
attributes #0 = { optsize }
|
||||
|
23
test/CodeGen/ARM/build-attributes-optimization.ll
Normal file
23
test/CodeGen/ARM/build-attributes-optimization.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 | FileCheck %s --check-prefix=NONE
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 | FileCheck %s --check-prefix=SPEED
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 | FileCheck %s --check-prefix=MAXSPEED
|
||||
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O0 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=NONE-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O1 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=SPEED-OBJ
|
||||
; RUN: llc < %s -mtriple=arm-none-none-eabi -mcpu=cortex-a7 -O3 -filetype obj -o - | llvm-readobj -arm-attributes - | FileCheck %s --check-prefix=MAXSPEED-OBJ
|
||||
|
||||
; NONE: .eabi_attribute 30, 5 @ Tag_ABI_optimization_goals
|
||||
; SPEED: .eabi_attribute 30, 1 @ Tag_ABI_optimization_goals
|
||||
; MAXSPEED: .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals
|
||||
|
||||
; NONE-OBJ: TagName: ABI_optimization_goals
|
||||
; NONE-OBJ-NEXT: Description: Debugging
|
||||
; SPEED-OBJ: TagName: ABI_optimization_goals
|
||||
; SPEED-OBJ-NEXT: Description: Speed
|
||||
; MAXSPEED-OBJ: TagName: ABI_optimization_goals
|
||||
; MAXSPEED-OBJ-NEXT: Description: Aggressive Speed
|
||||
|
||||
define i32 @f(i64 %z) {
|
||||
ret i32 0
|
||||
}
|
||||
|
@ -51,13 +51,6 @@ exit:
|
||||
;; ARM-NEXT: Other:
|
||||
;; ARM-NEXT: Section: [[MIXED_SECT]]
|
||||
|
||||
;; ARM: Symbol {
|
||||
;; ARM: Name: $d
|
||||
;; ARM-NEXT: Value: 0
|
||||
;; ARM-NEXT: Size: 0
|
||||
;; ARM-NEXT: Binding: Local
|
||||
;; ARM-NEXT: Type: None
|
||||
|
||||
;; ARM: Symbol {
|
||||
;; ARM: Name: $d
|
||||
;; ARM-NEXT: Value: 0x{{[0-9A-F]+}}
|
||||
@ -77,10 +70,17 @@ exit:
|
||||
;; ARM-NEXT: Section: .ARM.exidx
|
||||
;; ARM-NEXT: }
|
||||
|
||||
;; ARM: Symbol {
|
||||
;; ARM: Name: $d
|
||||
;; ARM-NEXT: Value: 0
|
||||
;; ARM-NEXT: Size: 0
|
||||
;; ARM-NEXT: Binding: Local
|
||||
;; ARM-NEXT: Type: None
|
||||
|
||||
;; ARM-NOT: ${{[atd]}}
|
||||
|
||||
;; TMB: Symbol {
|
||||
;; TMB: Name: $d.2
|
||||
;; TMB: Name: $d.1
|
||||
;; TMB-NEXT: Value: 0x{{[0-9A-F]+}}
|
||||
;; TMB-NEXT: Size: 0
|
||||
;; TMB-NEXT: Binding: Local
|
||||
|
Loading…
Reference in New Issue
Block a user