mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 14:10:41 +00:00
Add an 'inline hint' attribute to represent source
code hints that it would be a good idea to inline a function ("inline" keyword). No functional change yet; FEs do not emit this and inliner does not use it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80063 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8af76bdb74
commit
de86d473fc
@ -1042,6 +1042,11 @@ define void @f() optsize
|
|||||||
function into callers whenever possible, ignoring any active inlining size
|
function into callers whenever possible, ignoring any active inlining size
|
||||||
threshold for this caller.</dd>
|
threshold for this caller.</dd>
|
||||||
|
|
||||||
|
<dt><tt>inlinehint</tt></dt>
|
||||||
|
<dd>This attribute indicates that the source code contained a hint that inlining
|
||||||
|
this function is desirable (such as the "inline" keyword in C/C++). It
|
||||||
|
is just a hint; it imposes no requirements on the inliner.</dd>
|
||||||
|
|
||||||
<dt><tt>noinline</tt></dt>
|
<dt><tt>noinline</tt></dt>
|
||||||
<dd>This attribute indicates that the inliner should never inline this
|
<dd>This attribute indicates that the inliner should never inline this
|
||||||
function in any situation. This attribute may not be used together with
|
function in any situation. This attribute may not be used together with
|
||||||
|
@ -109,7 +109,8 @@ typedef enum {
|
|||||||
LLVMNoCaptureAttribute = 1<<21,
|
LLVMNoCaptureAttribute = 1<<21,
|
||||||
LLVMNoRedZoneAttribute = 1<<22,
|
LLVMNoRedZoneAttribute = 1<<22,
|
||||||
LLVMNoImplicitFloatAttribute = 1<<23,
|
LLVMNoImplicitFloatAttribute = 1<<23,
|
||||||
LLVMNakedAttribute = 1<<24
|
LLVMNakedAttribute = 1<<24,
|
||||||
|
LLVMInlineHintAttribute = 1<<25
|
||||||
} LLVMAttribute;
|
} LLVMAttribute;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -57,7 +57,8 @@ const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer
|
|||||||
const Attributes NoRedZone = 1<<22; /// disable redzone
|
const Attributes NoRedZone = 1<<22; /// disable redzone
|
||||||
const Attributes NoImplicitFloat = 1<<23; /// disable implicit floating point
|
const Attributes NoImplicitFloat = 1<<23; /// disable implicit floating point
|
||||||
/// instructions.
|
/// instructions.
|
||||||
const Attributes Naked = 1<<24; ///< Naked function
|
const Attributes Naked = 1<<24; ///< Naked function
|
||||||
|
const Attributes InlineHint = 1<<25; ///< source said inlining was desirable
|
||||||
|
|
||||||
/// @brief Attributes that only apply to function parameters.
|
/// @brief Attributes that only apply to function parameters.
|
||||||
const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
|
const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
|
||||||
@ -66,7 +67,7 @@ const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
|
|||||||
/// be used on return values or function parameters.
|
/// be used on return values or function parameters.
|
||||||
const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
|
const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
|
||||||
NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq |
|
NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq |
|
||||||
NoRedZone | NoImplicitFloat | Naked;
|
NoRedZone | NoImplicitFloat | Naked | InlineHint;
|
||||||
|
|
||||||
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
||||||
const Attributes VarArgsIncompatible = StructRet;
|
const Attributes VarArgsIncompatible = StructRet;
|
||||||
|
@ -556,6 +556,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
|||||||
KEYWORD(readnone);
|
KEYWORD(readnone);
|
||||||
KEYWORD(readonly);
|
KEYWORD(readonly);
|
||||||
|
|
||||||
|
KEYWORD(inlinehint);
|
||||||
KEYWORD(noinline);
|
KEYWORD(noinline);
|
||||||
KEYWORD(alwaysinline);
|
KEYWORD(alwaysinline);
|
||||||
KEYWORD(optsize);
|
KEYWORD(optsize);
|
||||||
|
@ -907,6 +907,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
|||||||
case lltok::kw_noinline: Attrs |= Attribute::NoInline; break;
|
case lltok::kw_noinline: Attrs |= Attribute::NoInline; break;
|
||||||
case lltok::kw_readnone: Attrs |= Attribute::ReadNone; break;
|
case lltok::kw_readnone: Attrs |= Attribute::ReadNone; break;
|
||||||
case lltok::kw_readonly: Attrs |= Attribute::ReadOnly; break;
|
case lltok::kw_readonly: Attrs |= Attribute::ReadOnly; break;
|
||||||
|
case lltok::kw_inlinehint: Attrs |= Attribute::InlineHint; break;
|
||||||
case lltok::kw_alwaysinline: Attrs |= Attribute::AlwaysInline; break;
|
case lltok::kw_alwaysinline: Attrs |= Attribute::AlwaysInline; break;
|
||||||
case lltok::kw_optsize: Attrs |= Attribute::OptimizeForSize; break;
|
case lltok::kw_optsize: Attrs |= Attribute::OptimizeForSize; break;
|
||||||
case lltok::kw_ssp: Attrs |= Attribute::StackProtect; break;
|
case lltok::kw_ssp: Attrs |= Attribute::StackProtect; break;
|
||||||
|
@ -82,6 +82,7 @@ namespace lltok {
|
|||||||
kw_readnone,
|
kw_readnone,
|
||||||
kw_readonly,
|
kw_readonly,
|
||||||
|
|
||||||
|
kw_inlinehint,
|
||||||
kw_noinline,
|
kw_noinline,
|
||||||
kw_alwaysinline,
|
kw_alwaysinline,
|
||||||
kw_optsize,
|
kw_optsize,
|
||||||
|
@ -472,6 +472,7 @@ namespace {
|
|||||||
HANDLE_ATTR(Nest);
|
HANDLE_ATTR(Nest);
|
||||||
HANDLE_ATTR(ReadNone);
|
HANDLE_ATTR(ReadNone);
|
||||||
HANDLE_ATTR(ReadOnly);
|
HANDLE_ATTR(ReadOnly);
|
||||||
|
HANDLE_ATTR(InlineHint);
|
||||||
HANDLE_ATTR(NoInline);
|
HANDLE_ATTR(NoInline);
|
||||||
HANDLE_ATTR(AlwaysInline);
|
HANDLE_ATTR(AlwaysInline);
|
||||||
HANDLE_ATTR(OptimizeForSize);
|
HANDLE_ATTR(OptimizeForSize);
|
||||||
|
@ -55,6 +55,8 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
|||||||
Result += "optsize ";
|
Result += "optsize ";
|
||||||
if (Attrs & Attribute::NoInline)
|
if (Attrs & Attribute::NoInline)
|
||||||
Result += "noinline ";
|
Result += "noinline ";
|
||||||
|
if (Attrs & Attribute::InlineHint)
|
||||||
|
Result += "inlinehint ";
|
||||||
if (Attrs & Attribute::AlwaysInline)
|
if (Attrs & Attribute::AlwaysInline)
|
||||||
Result += "alwaysinline ";
|
Result += "alwaysinline ";
|
||||||
if (Attrs & Attribute::StackProtect)
|
if (Attrs & Attribute::StackProtect)
|
||||||
|
@ -161,6 +161,7 @@ FuncAttr ::= noreturn
|
|||||||
| signext
|
| signext
|
||||||
| readnone
|
| readnone
|
||||||
| readonly
|
| readonly
|
||||||
|
| inlinehint
|
||||||
| noinline
|
| noinline
|
||||||
| alwaysinline
|
| alwaysinline
|
||||||
| optsize
|
| optsize
|
||||||
|
@ -51,7 +51,7 @@ syn keyword llvmKeyword volatile fastcc coldcc cc ccc
|
|||||||
syn keyword llvmKeyword x86_stdcallcc x86_fastcallcc
|
syn keyword llvmKeyword x86_stdcallcc x86_fastcallcc
|
||||||
syn keyword llvmKeyword signext zeroext inreg sret nounwind noreturn
|
syn keyword llvmKeyword signext zeroext inreg sret nounwind noreturn
|
||||||
syn keyword llvmKeyword nocapture byval nest readnone readonly noalias
|
syn keyword llvmKeyword nocapture byval nest readnone readonly noalias
|
||||||
syn keyword llvmKeyword noinline alwaysinline optsize ssp sspreq
|
syn keyword llvmKeyword inlinehint noinline alwaysinline optsize ssp sspreq
|
||||||
syn keyword llvmKeyword noredzone noimplicitfloat naked
|
syn keyword llvmKeyword noredzone noimplicitfloat naked
|
||||||
syn keyword llvmKeyword module asm align tail to
|
syn keyword llvmKeyword module asm align tail to
|
||||||
syn keyword llvmKeyword addrspace section alias sideeffect c gc
|
syn keyword llvmKeyword addrspace section alias sideeffect c gc
|
||||||
|
Loading…
Reference in New Issue
Block a user