Add the returns_twice attribute to LLVM.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 3 Oct 2011 14:45:37 +0000 (14:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 3 Oct 2011 14:45:37 +0000 (14:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141001 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LangRef.html
include/llvm/Attributes.h
lib/AsmParser/LLLexer.cpp
lib/AsmParser/LLParser.cpp
lib/AsmParser/LLToken.h
lib/Target/CppBackend/CPPBackend.cpp
lib/VMCore/Attributes.cpp
test/Transforms/Mem2Reg/2007-08-27-VolatileLoadsStores.ll
test/Transforms/TailCallElim/setjmp.ll

index 0ec08eb0a0589c22edc1a9b4e4eb46924a252a7e..7882da67e1aa93b12ec05ddf3262e76580b9ba9d 100644 (file)
@@ -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>
index cd3ee35d7497c0059b252d1a982b086201e23697..2d7b33b29bcfb221e671f8bbc223c88c230c1d1b 100644 (file)
@@ -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;
index fdadd1ba93f6238d73e1881c5a0dce8e42cd9f97..029f9426f6833e5b6c0d47a9a323a7ecc111c216 100644 (file)
@@ -558,6 +558,7 @@ lltok::Kind LLLexer::LexIdentifier() {
   KEYWORD(readnone);
   KEYWORD(readonly);
   KEYWORD(uwtable);
+  KEYWORD(returns_twice);
 
   KEYWORD(inlinehint);
   KEYWORD(noinline);
index 4d233cab6fbe93a539b0a209ea0042a64e4c7405..cafaab01afd98eedbe9d599d068c26fd660d2326 100644 (file)
@@ -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: {
index d22ecf31bdaebbc1ea7b07c112ff5efe22e9a8b9..acdd4b8ebf83312c2247bf048e02da8a8f61b2ff 100644 (file)
@@ -90,6 +90,7 @@ namespace lltok {
     kw_readnone,
     kw_readonly,
     kw_uwtable,
+    kw_returns_twice,
 
     kw_inlinehint,
     kw_noinline,
index 16401a8f98b9b5addf3d7e6fd3beedcf3c98bcbe..9a6ff3292ab64d57ef49351981bf1edbd47c0627 100644 (file)
@@ -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
index b728b9284b4499fa701d7cc864a8d5584ce40c2d..485be75d1b1274d5cbaee2015d5c7cc0419aaffc 100644 (file)
@@ -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) {
index 50683cf8baa0dc1d4e190a386eb20aa5fc6332d1..52a8375312961ce771d8bfd45c2b4087d2dc0048 100644 (file)
@@ -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()
index 7b7fe568259e498c5974edf4b5871cedff54a4ed..35bb75dddb30ea55633ee0dfd4774fcd64202d97 100644 (file)
@@ -11,6 +11,6 @@ bb:
   ret void
 }
 
-declare i32 @setjmp(i32*)
+declare i32 @setjmp(i32*) returns_twice
 
 declare void @bar()