forked from OSchip/llvm-project
[MSExtensions] Add support for __forceinline.
__forceinline is a combination of the inline keyword and __attribute__((always_inline)) llvm-svn: 158653
This commit is contained in:
parent
7b3f322517
commit
f97bd8c9cb
|
@ -824,6 +824,10 @@ def DLLImport : InheritableAttr {
|
|||
let Spellings = ["dllimport"];
|
||||
}
|
||||
|
||||
def ForceInline : InheritableAttr {
|
||||
let Spellings = ["__forceinline"];
|
||||
}
|
||||
|
||||
def Win64 : InheritableAttr {
|
||||
let Spellings = ["__w64"];
|
||||
}
|
||||
|
|
|
@ -518,7 +518,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
|
|||
F->addFnAttr(llvm::Attribute::NoInline);
|
||||
|
||||
// (noinline wins over always_inline, and we can't specify both in IR)
|
||||
if (D->hasAttr<AlwaysInlineAttr>() &&
|
||||
if ((D->hasAttr<AlwaysInlineAttr>() || D->hasAttr<ForceInlineAttr>()) &&
|
||||
!F->hasFnAttr(llvm::Attribute::NoInline))
|
||||
F->addFnAttr(llvm::Attribute::AlwaysInline);
|
||||
|
||||
|
@ -935,7 +935,7 @@ CodeGenModule::shouldEmitFunction(const FunctionDecl *F) {
|
|||
if (getFunctionLinkage(F) != llvm::Function::AvailableExternallyLinkage)
|
||||
return true;
|
||||
if (CodeGenOpts.OptimizationLevel == 0 &&
|
||||
!F->hasAttr<AlwaysInlineAttr>())
|
||||
!F->hasAttr<AlwaysInlineAttr>() && !F->hasAttr<ForceInlineAttr>())
|
||||
return false;
|
||||
// PR9614. Avoid cases where the source code is lying to us. An available
|
||||
// externally function should have an equivalent function somewhere else,
|
||||
|
|
|
@ -2251,9 +2251,14 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
|
|||
continue;
|
||||
|
||||
// Microsoft single token adornments.
|
||||
case tok::kw___forceinline:
|
||||
// FIXME: Add handling here!
|
||||
break;
|
||||
case tok::kw___forceinline: {
|
||||
isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID);
|
||||
IdentifierInfo *AttrName = Tok.getIdentifierInfo();
|
||||
SourceLocation AttrNameLoc = ConsumeToken();
|
||||
DS.getAttributes().addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
|
||||
SourceLocation(), 0, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
case tok::kw___ptr64:
|
||||
case tok::kw___ptr32:
|
||||
|
|
|
@ -3888,6 +3888,13 @@ static void handlePortabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
|
||||
}
|
||||
|
||||
static void handleForceInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
||||
if (S.LangOpts.MicrosoftExt)
|
||||
D->addAttr(::new (S.Context) ForceInlineAttr(Attr.getRange(), S.Context));
|
||||
else
|
||||
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Top Level Sema Entry Points
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -4082,6 +4089,9 @@ static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
|
|||
case AttributeList::AT_ptr64:
|
||||
handlePortabilityAttr(S, D, Attr);
|
||||
break;
|
||||
case AttributeList::AT_forceinline:
|
||||
handleForceInlineAttr(S, D, Attr);
|
||||
break;
|
||||
|
||||
// Thread safety attributes:
|
||||
case AttributeList::AT_guarded_var:
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 -triple i686-win32 -emit-llvm -fms-extensions < %s | FileCheck %s
|
||||
|
||||
void bar() {
|
||||
}
|
||||
|
||||
// CHECK-NOT: foo
|
||||
__forceinline void foo() {
|
||||
bar();
|
||||
}
|
||||
|
||||
void i_want_bar() {
|
||||
// CHECK: call void @bar
|
||||
foo();
|
||||
}
|
Loading…
Reference in New Issue