OSDN Git Service

Fix defer/recover at high optimization levels.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Sep 2011 18:48:08 +0000 (18:48 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Sep 2011 18:48:08 +0000 (18:48 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178859 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/gogo-tree.cc

index ed211e9..fbddc04 100644 (file)
@@ -1159,8 +1159,11 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
 
          // If a function calls the predeclared recover function, we
          // can't inline it, because recover behaves differently in a
 
          // If a function calls the predeclared recover function, we
          // can't inline it, because recover behaves differently in a
-         // function passed directly to defer.
-         if (this->calls_recover_ && !this->is_recover_thunk_)
+         // function passed directly to defer.  If this is a recover
+         // thunk that we built to test whether a function can be
+         // recovered, we can't inline it, because that will mess up
+         // our return address comparison.
+         if (this->calls_recover_ || this->is_recover_thunk_)
            DECL_UNINLINABLE(decl) = 1;
 
          // If this is a thunk created to call a function which calls
            DECL_UNINLINABLE(decl) = 1;
 
          // If this is a thunk created to call a function which calls