mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +00:00
[clang] Restrict Inline Builtin to non-static, non-odr linkage
Inline builtins have a very special behavior compared to other functions, it's better if we keep them restricted to a minimal set of functions. Add a linkage check which prevents considering ODR definitions as inline builtins. Fix #62958 Differential Revision: https://reviews.llvm.org/D148723
This commit is contained in:
parent
752f9d02cc
commit
e20931b2cc
@ -3314,8 +3314,23 @@ bool FunctionDecl::isInlineBuiltinDeclaration() const {
|
||||
return false;
|
||||
|
||||
const FunctionDecl *Definition;
|
||||
return hasBody(Definition) && Definition->isInlineSpecified() &&
|
||||
Definition->hasAttr<AlwaysInlineAttr>();
|
||||
if (!hasBody(Definition))
|
||||
return false;
|
||||
|
||||
if (!Definition->isInlineSpecified() ||
|
||||
!Definition->hasAttr<AlwaysInlineAttr>())
|
||||
return false;
|
||||
|
||||
ASTContext &Context = getASTContext();
|
||||
switch (Context.GetGVALinkageForFunction(this)) {
|
||||
case GVA_Internal:
|
||||
case GVA_DiscardableODR:
|
||||
case GVA_StrongODR:
|
||||
return false;
|
||||
case GVA_AvailableExternally:
|
||||
case GVA_StrongExternal:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool FunctionDecl::isDestroyingOperatorDelete() const {
|
||||
|
16
clang/test/CodeGen/inline-builtin-comdat.c
Normal file
16
clang/test/CodeGen/inline-builtin-comdat.c
Normal file
@ -0,0 +1,16 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
|
||||
// Inline builtin are not supported for odr linkage
|
||||
// CHECK-NOT: .inline
|
||||
|
||||
double __cdecl frexp( double _X, int* _Y);
|
||||
inline __attribute__((always_inline)) long double __cdecl frexpl( long double __x, int *__exp ) {
|
||||
return (long double) frexp((double)__x, __exp );
|
||||
}
|
||||
|
||||
long double pain(void)
|
||||
{
|
||||
long double f = 123.45;
|
||||
int i;
|
||||
long double f2 = frexpl(f, &i);
|
||||
return f2;
|
||||
}
|
Loading…
Reference in New Issue
Block a user