Skip to content

Commit

Permalink
Give builtins and alloc/dealloc operators the default calling convent…
Browse files Browse the repository at this point in the history
…ion.

On SPIR targets, the default calling convention is SpirFunction.
However, operator new/delete and builtins were being created with CC_C.
The result is indirect references to new/delete (or builtins that are permitted
to be called indirectly have a mismatched type, as well as questionable codegen
in some cases.

This patch sets both to the default calling convention, so that it
properly matches the calling convention of the target.

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

Change-Id: I52065bb00bc2655945caea8f29c409ba1e0ac24a
llvm-svn: 355317
  • Loading branch information
Erich Keane committed Mar 4, 2019
1 parent eeb1144 commit 881e83d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
6 changes: 4 additions & 2 deletions clang/lib/AST/ASTContext.cpp
Expand Up @@ -9565,10 +9565,12 @@ QualType ASTContext::GetBuiltinType(unsigned Id,
assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
"'.' should only occur at end of builtin type list!");

FunctionType::ExtInfo EI(CC_C);
bool Variadic = (TypeStr[0] == '.');

FunctionType::ExtInfo EI(
getDefaultCallingConvention(Variadic, /*IsCXXMethod=*/false));
if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);

bool Variadic = (TypeStr[0] == '.');

// We really shouldn't be making a no-proto type here.
if (ArgTypes.empty() && Variadic && !getLangOpts().CPlusPlus)
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaExprCXX.cpp
Expand Up @@ -2795,7 +2795,8 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
}
}

FunctionProtoType::ExtProtoInfo EPI;
FunctionProtoType::ExtProtoInfo EPI(Context.getDefaultCallingConvention(
/*IsVariadic=*/false, /*IsCXXMethod=*/false));

QualType BadAllocType;
bool HasBadAllocExceptionSpec
Expand Down
42 changes: 42 additions & 0 deletions clang/test/CodeGenCXX/builtin-calling-conv.cpp
@@ -0,0 +1,42 @@
// RUN: %clang_cc1 -triple x86_64-linux-pc -DREDECL -emit-llvm %s -o - | FileCheck %s -check-prefix LINUX
// RUN: %clang_cc1 -triple spir-unknown-unknown -DREDECL -DSPIR -emit-llvm %s -o - | FileCheck %s -check-prefix SPIR
// RUN: %clang_cc1 -triple x86_64-linux-pc -emit-llvm %s -o - | FileCheck %s -check-prefix LINUX
// RUN: %clang_cc1 -triple spir-unknown-unknown -DSPIR -emit-llvm %s -o - | FileCheck %s -check-prefix SPIR

#ifdef REDECL
namespace std {
#ifdef SPIR
using size_t = unsigned int;
#else
using size_t = unsigned long;
#endif // SPIR
} // namespace std

float __builtin_atan2f(float, float);
void *operator new(std::size_t);
#endif // REDECL

void foo();

void user() {
int i;
::operator new(5);
(void)__builtin_atan2f(1.1, 2.2);
foo();
}

// LINUX: define void @_Z4userv()
// LINUX: call i8* @_Znwm
// LINUX: call float @atan2f
// LINUX: call void @_Z3foov
// LINUX: declare noalias i8* @_Znwm(i64)
// LINUX: declare float @atan2f(float, float)
// LINUX: declare void @_Z3foov()

// SPIR: define spir_func void @_Z4userv()
// SPIR: call spir_func i8* @_Znwj
// SPIR: call spir_func float @atan2f
// SPIR: call spir_func void @_Z3foov
// SPIR: declare spir_func noalias i8* @_Znwj(i32)
// SPIR: declare spir_func float @atan2f(float, float)
// SPIR: declare spir_func void @_Z3foov()

0 comments on commit 881e83d

Please sign in to comment.