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:
Dale Johannesen 2009-08-26 01:08:21 +00:00
parent 8af76bdb74
commit de86d473fc
10 changed files with 18 additions and 4 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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)

View File

@ -161,6 +161,7 @@ FuncAttr ::= noreturn
| signext | signext
| readnone | readnone
| readonly | readonly
| inlinehint
| noinline | noinline
| alwaysinline | alwaysinline
| optsize | optsize

View File

@ -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