From 919fe9877fca5ab9d4fd1752d75ca54d4d013da9 Mon Sep 17 00:00:00 2001 From: Justin Lebar <jlebar@google.com> Date: Wed, 27 Jul 2016 22:04:24 +0000 Subject: [PATCH] Don't crash when generating code for __attribute__((naked)) member functions. Summary: Previously this crashed inside EmitThisParam(). There should be no prelude for naked functions, so just skip the whole thing. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D22715 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@276925 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/ItaniumCXXABI.cpp | 4 ++++ lib/CodeGen/MicrosoftCXXABI.cpp | 4 ++++ test/CodeGenCXX/naked.cpp | 13 +++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 test/CodeGenCXX/naked.cpp diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 6051594fb00..36eb40ef09c 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -1390,6 +1390,10 @@ void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF, } void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { + // Naked functions have no prolog. + if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>()) + return; + /// Initialize the 'this' slot. EmitThisParam(CGF); diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 6b919d16881..28312fce774 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1417,6 +1417,10 @@ llvm::Value *MicrosoftCXXABI::adjustThisParameterInVirtualFunctionPrologue( } void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { + // Naked functions have no prolog. + if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>()) + return; + EmitThisParam(CGF); /// If this is a function that the ABI specifies returns 'this', initialize diff --git a/test/CodeGenCXX/naked.cpp b/test/CodeGenCXX/naked.cpp new file mode 100644 index 00000000000..7032823e44b --- /dev/null +++ b/test/CodeGenCXX/naked.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows -emit-llvm %s -o - | FileCheck %s + +class TestNaked { +public: + void NakedFunction(); +}; + +__attribute__((naked)) void TestNaked::NakedFunction() { + // CHECK-LABEL: define void @ + // CHECK: call void asm sideeffect + asm(""); +} -- GitLab