]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUILD: tools: work around an internal compiler bug in gcc-3.4
authorWilly Tarreau <w@1wt.eu>
Sun, 16 Jun 2019 16:16:33 +0000 (18:16 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 16 Jun 2019 16:16:33 +0000 (18:16 +0200)
gcc-3.4 fails to compile standard.c :

src/standard.c: In function `str2sa_range':
src/standard.c:1034: error: unrecognizable insn:
(insn 582 581 583 37 src/standard.c:949 (set (reg/f:SI 262)
        (high:SI (const:SI (plus:SI (symbol_ref:SI ("*ss.4") [flags 0x22] <var_decl fe782e80 ss>)
                    (const_int 2 [0x2]))))) -1 (nil)
    (nil))
src/standard.c:1034: internal compiler error: in extract_insn, at recog.c:2083

The workaround is explained here :

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21613

It only requires creating a local variable containing the result of the
cast, which is totally harmless, so let's do it.

src/standard.c

index 3651f5e35ddb3dc0e4b1ff2e92ca7f6ef2334681..2f205f74832243b13aabe25bb41d56a4ee60646c 100644 (file)
@@ -928,6 +928,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                ss.ss_family = AF_UNSPEC;
        }
        else if (ss.ss_family == AF_UNIX) {
+               struct sockaddr_un *un = (struct sockaddr_un *)&ss;
                int prefix_path_len;
                int max_path_len;
                int adr_len;
@@ -936,7 +937,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                 * <unix_bind_prefix><path>.<pid>.<bak|tmp>
                 */
                prefix_path_len = (pfx && !abstract) ? strlen(pfx) : 0;
-               max_path_len = (sizeof(((struct sockaddr_un *)&ss)->sun_path) - 1) -
+               max_path_len = (sizeof(un->sun_path) - 1) -
                        (prefix_path_len ? prefix_path_len + 1 + 5 + 1 + 3 : 0);
 
                adr_len = strlen(str2);
@@ -946,10 +947,10 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                }
 
                /* when abstract==1, we skip the first zero and copy all bytes except the trailing zero */
-               memset(((struct sockaddr_un *)&ss)->sun_path, 0, sizeof(((struct sockaddr_un *)&ss)->sun_path));
+               memset(un->sun_path, 0, sizeof(un->sun_path));
                if (prefix_path_len)
-                       memcpy(((struct sockaddr_un *)&ss)->sun_path, pfx, prefix_path_len);
-               memcpy(((struct sockaddr_un *)&ss)->sun_path + prefix_path_len + abstract, str2, adr_len + 1 - abstract);
+                       memcpy(un->sun_path, pfx, prefix_path_len);
+               memcpy(un->sun_path + prefix_path_len + abstract, str2, adr_len + 1 - abstract);
        }
        else { /* IPv4 and IPv6 */
                char *end = str2 + strlen(str2);