forked from OSchip/llvm-project
Add the returns_twice attribute to LLVM.
llvm-svn: 141001
This commit is contained in:
parent
adf23a400d
commit
cc349c8dd8
|
@ -1262,6 +1262,11 @@ define void @f() optsize { ... }
|
|||
the ELF x86-64 abi, but it can be disabled for some compilation
|
||||
units.</dd>
|
||||
|
||||
<dt><tt><b><a name="returns_twice">returns_twice</a></b></tt></dt>
|
||||
<dd>This attribute indicates that this function can return
|
||||
twice. The C <code>setjmp</code> is an example of such a function.
|
||||
The compiler disables some optimizations (like tail calls) in the caller of
|
||||
these functions.</dd>
|
||||
</dl>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -65,8 +65,7 @@ const Attributes StackAlignment = 7<<26; ///< Alignment of stack for
|
|||
///of alignment with +1 bias
|
||||
///0 means unaligned (different from
|
||||
///alignstack(1))
|
||||
const Attributes Hotpatch = 1<<29; ///< Function should have special
|
||||
///'hotpatch' sequence in prologue
|
||||
const Attributes ReturnsTwice = 1<<29; ///< Function can return twice
|
||||
const Attributes UWTable = 1<<30; ///< Function must be in a unwind
|
||||
///table
|
||||
const Attributes NonLazyBind = 1U<<31; ///< Function is called early and/or
|
||||
|
@ -93,7 +92,7 @@ const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
|
|||
const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
|
||||
NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq |
|
||||
NoRedZone | NoImplicitFloat | Naked | InlineHint | StackAlignment |
|
||||
Hotpatch | UWTable | NonLazyBind;
|
||||
UWTable | NonLazyBind | ReturnsTwice;
|
||||
|
||||
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
||||
const Attributes VarArgsIncompatible = StructRet;
|
||||
|
|
|
@ -558,6 +558,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
|||
KEYWORD(readnone);
|
||||
KEYWORD(readonly);
|
||||
KEYWORD(uwtable);
|
||||
KEYWORD(returns_twice);
|
||||
|
||||
KEYWORD(inlinehint);
|
||||
KEYWORD(noinline);
|
||||
|
|
|
@ -911,6 +911,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
|||
case lltok::kw_noreturn: Attrs |= Attribute::NoReturn; break;
|
||||
case lltok::kw_nounwind: Attrs |= Attribute::NoUnwind; break;
|
||||
case lltok::kw_uwtable: Attrs |= Attribute::UWTable; break;
|
||||
case lltok::kw_returns_twice: Attrs |= Attribute::ReturnsTwice; break;
|
||||
case lltok::kw_noinline: Attrs |= Attribute::NoInline; break;
|
||||
case lltok::kw_readnone: Attrs |= Attribute::ReadNone; break;
|
||||
case lltok::kw_readonly: Attrs |= Attribute::ReadOnly; break;
|
||||
|
@ -922,7 +923,6 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) {
|
|||
case lltok::kw_noredzone: Attrs |= Attribute::NoRedZone; break;
|
||||
case lltok::kw_noimplicitfloat: Attrs |= Attribute::NoImplicitFloat; break;
|
||||
case lltok::kw_naked: Attrs |= Attribute::Naked; break;
|
||||
case lltok::kw_hotpatch: Attrs |= Attribute::Hotpatch; break;
|
||||
case lltok::kw_nonlazybind: Attrs |= Attribute::NonLazyBind; break;
|
||||
|
||||
case lltok::kw_alignstack: {
|
||||
|
|
|
@ -90,6 +90,7 @@ namespace lltok {
|
|||
kw_readnone,
|
||||
kw_readonly,
|
||||
kw_uwtable,
|
||||
kw_returns_twice,
|
||||
|
||||
kw_inlinehint,
|
||||
kw_noinline,
|
||||
|
|
|
@ -470,7 +470,7 @@ void CppWriter::printAttributes(const AttrListPtr &PAL,
|
|||
HANDLE_ATTR(NoImplicitFloat);
|
||||
HANDLE_ATTR(Naked);
|
||||
HANDLE_ATTR(InlineHint);
|
||||
HANDLE_ATTR(Hotpatch);
|
||||
HANDLE_ATTR(ReturnsTwice);
|
||||
HANDLE_ATTR(UWTable);
|
||||
HANDLE_ATTR(NonLazyBind);
|
||||
#undef HANDLE_ATTR
|
||||
|
|
|
@ -38,6 +38,8 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
|||
Result += "nounwind ";
|
||||
if (Attrs & Attribute::UWTable)
|
||||
Result += "uwtable ";
|
||||
if (Attrs & Attribute::ReturnsTwice)
|
||||
Result += "returns_twice ";
|
||||
if (Attrs & Attribute::InReg)
|
||||
Result += "inreg ";
|
||||
if (Attrs & Attribute::NoAlias)
|
||||
|
@ -72,8 +74,6 @@ std::string Attribute::getAsString(Attributes Attrs) {
|
|||
Result += "noimplicitfloat ";
|
||||
if (Attrs & Attribute::Naked)
|
||||
Result += "naked ";
|
||||
if (Attrs & Attribute::Hotpatch)
|
||||
Result += "hotpatch ";
|
||||
if (Attrs & Attribute::NonLazyBind)
|
||||
Result += "nonlazybind ";
|
||||
if (Attrs & Attribute::StackAlignment) {
|
||||
|
|
|
@ -42,6 +42,6 @@ return: ; preds = %bb6
|
|||
ret i32 %retval8
|
||||
}
|
||||
|
||||
declare i32 @_setjmp(%struct.__jmp_buf_tag*)
|
||||
declare i32 @_setjmp(%struct.__jmp_buf_tag*) returns_twice
|
||||
|
||||
declare void @g()
|
||||
|
|
|
@ -11,6 +11,6 @@ bb:
|
|||
ret void
|
||||
}
|
||||
|
||||
declare i32 @setjmp(i32*)
|
||||
declare i32 @setjmp(i32*) returns_twice
|
||||
|
||||
declare void @bar()
|
||||
|
|
Loading…
Reference in New Issue