Skip to content

Commit

Permalink
[ARM] prologue instructions emitted for naked function with >64 byte …
Browse files Browse the repository at this point in the history
…argument

Summary:

The naked function attribute is meant to suppress all function
prologue/epilogue instructions.

On ARM, some are still emitted if an argument greater than 64 bytes in size
(the threshold for using the byval attribute in IR) is passed partially
in registers.

Perform the check for Attribute::Naked and early exit in
SelectionDAGISel::LowerArguments().

Checking in ARMFrameLowering::determineCalleeSaves() is too late.

A test case is included.

Reviewers: llvm-commits, olista01, danielkiss

Reviewed By: danielkiss

Subscribers: kristof.beyls, hiraditya, danielkiss

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D80715

Change-Id: Icedecf2a4ad31bc3c35ab0df7489a9d346e1f7cc
  • Loading branch information
simonwallis2 committed Jun 9, 2020
1 parent 3b6196c commit 4dba596
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Expand Up @@ -9607,6 +9607,10 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
const DataLayout &DL = DAG.getDataLayout();
SmallVector<ISD::InputArg, 16> Ins;

// In Naked functions we aren't going to save any registers.
if (F.hasFnAttribute(Attribute::Naked))
return;

if (!FuncInfo->CanLowerReturn) {
// Put in an sret pointer parameter before all the other parameters.
SmallVector<EVT, 1> ValueVTs;
Expand Down
13 changes: 13 additions & 0 deletions llvm/test/CodeGen/ARM/naked-no-prolog.ll
@@ -0,0 +1,13 @@
; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a7 -verify-machineinstrs %s -o - | FileCheck %s

%struct.S = type { [65 x i8] }

define void @naked_no_prologue(%struct.S* byval(%struct.S) align 4 %0) naked noinline nounwind optnone {
; CHECK-NOT: stm
; CHECK-NOT: str

entry:
ret void
unreachable
}

0 comments on commit 4dba596

Please sign in to comment.