diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index de5fa2209bd632fb73d57bd8a5842db6f75f1c75..2a74c5f8310b2541649f187a4ef11d988d885afb 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -49,7 +49,7 @@ typedef struct
 
 
 /*
- * Called when ERROR or FATAL happens in SendBaseBackup() after
+ * Called when ERROR or FATAL happens in perform_base_backup() after
  * we have started the backup - make sure we end it!
  */
 static void
@@ -58,6 +58,37 @@ base_backup_cleanup(int code, Datum arg)
 	do_pg_abort_backup();
 }
 
+/*
+ * Actually do a base backup for the specified tablespaces.
+ *
+ * This is split out mainly to avoid complaints about "variable might be
+ * clobbered by longjmp" from stupider versions of gcc.
+ */
+static void
+perform_base_backup(const char *backup_label, List *tablespaces)
+{
+	do_pg_start_backup(backup_label, true);
+
+	PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0);
+	{
+		ListCell   *lc;
+
+		/* Send tablespace header */
+		SendBackupHeader(tablespaces);
+
+		/* Send off our tablespaces one by one */
+		foreach(lc, tablespaces)
+		{
+			tablespaceinfo *ti = (tablespaceinfo *) lfirst(lc);
+
+			SendBackupDirectory(ti->path, ti->oid);
+		}
+	}
+	PG_END_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0);
+
+	do_pg_stop_backup();
+}
+
 /*
  * SendBaseBackup() - send a complete base backup.
  *
@@ -145,26 +176,7 @@ SendBaseBackup(const char *options)
 	}
 	FreeDir(dir);
 
-	do_pg_start_backup(backup_label, true);
-
-	PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0);
-	{
-		ListCell   *lc;
-
-		/* Send tablespace header */
-		SendBackupHeader(tablespaces);
-
-		/* Send off our tablespaces one by one */
-		foreach(lc, tablespaces)
-		{
-			ti = (tablespaceinfo *) lfirst(lc);
-
-			SendBackupDirectory(ti->path, ti->oid);
-		}
-	}
-	PG_END_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0);
-
-	do_pg_stop_backup();
+	perform_base_backup(backup_label, tablespaces);
 
 	MemoryContextSwitchTo(old_context);
 	MemoryContextDelete(backup_context);