Your message dated Thu, 2 Aug 2007 00:37:46 +0200 with message-id <20070801223746.GA23700@wavehammer.waldi.eu.org> and subject line Bug#435546: gcc-4.1: Wrong loop code generation using O2 has caused the attached Bug report to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what I am talking about this indicates a serious mail system misconfiguration somewhere. Please contact me immediately.) Debian bug tracking system administrator (administrator, Debian Bugs database)
--- Begin Message ---
- To: submit@bugs.debian.org
- Subject: gcc-4.1: Wrong loop code generation using O2
- From: Javier Cabezas Rodríguez <javier.cabezas@gmail.com>
- Date: Wed, 01 Aug 2007 16:16:13 +0200
- Message-id: <[🔎] 1185977773.9574.3.camel@bastion-laptop>
Package: gcc-4.1 Version: 4.1.2-13 Severity: important void do_pin_processes(int pids[], int n, char pin) { int i; for (i = 0; i < n; i++) { printf("%d\n", i); do_pin_process(pids[i], pin); } } When I compile the attached program with the following flags the compiler generates a infinite loop in the function do_pin_processes (the i variable is not incremented): gcc -DHAVE_CONFIG_H -I. -I.. -I../include -pg -g -g -O2 -MT pin-main.o -MD -MP -MF .deps/pin-main.Tpo -c -o pin-main.o `test -f 'main.c' || echo './'`main.c mv -f .deps/pin-main.Tpo .deps/pin-main.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -pg -g -g -O2 -MT pin-pin.o -MD -MP -MF .deps/pin-pin.Tpo -c -o pin-pin.o `test -f 'pin.c' || echo './'`pin.c mv -f .deps/pin-pin.Tpo .deps/pin-pin.Po gcc -DHAVE_CONFIG_H -I. -I.. -I../include -pg -g -g -O2 -MT pin-error.o -MD -MP -MF .deps/pin-error.Tpo -c -o pin-error.o `test -f 'error.c' || echo './'`error.c mv -f .deps/pin-error.Tpo .deps/pin-error.Po gcc -pg -g -g -O2 -pg -g -o pin pin-main.o pin-pin.o pin-error.o -lpopt However if I export the CFLAGS variable with -O0 it works properly. The arguments passed to the program and the obtained outputs are: (cmd line) $ ./pin -l "1 2 3" (output bad code) $ Pinning 1 (0): done 0 Pinning 1 (0): done 0 Pinning 1 (0): done 0 Pinning 1 (0): done 0 Pinning 1 (0): done ... (output correct code) $ 0 Pinning 1 (0): done 1 Pinning 2 (0): failed Permission denied 2 Pinning 3 (0): failed Permission denied I have the same problem if I use gcc-4.2. Thanks, Javi#include <stdio.h> #include <errno.h> FILE * error_file; char err_debug_mode; __attribute__((constructor)) static void init_error() { error_file = stderr; err_debug_mode = 0; } __attribute__((destructor)) static void fini_error() { if (error_file != stderr) fclose(error_file); } int err_set_output_path(char * path) { int ret = 0; if (error_file != stderr) fclose(error_file); error_file = fopen(path, "a+"); if (!error_file) { error_file = stderr; ret = errno; } return ret; } int err_set_output_file(FILE * f) { int ret = 0; if (error_file != stderr) fclose(error_file); error_file = f; if (!error_file) { error_file = stderr; ret = errno; } return ret; }/* pin - pin and unpin processes in memory Copyright (C) 2007 Javier Cabezas Rodriguez This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdio.h> #include <sys/types.h> #include <popt.h> #include "system.h" #include "pin.h" #include "error.h" #define EXIT_FAILURE 1 /* The name the program was run with, stripped of any leading path. */ char * program_name; typedef struct { char unpin; char all; char * pids; } t_cmd_args; t_cmd_args program_args; /* Option flags and variables */ static const struct poptOption program_options[] = { {"unpin", 'u', POPT_ARG_NONE, 0, 'u', "unpin the listed process/es"}, {"all", 'a', POPT_ARG_NONE, 0, 'a', "pin/unpin all the processes"}, {"list", 'l', POPT_ARG_STRING, &program_args.pids, 0, "pin/unpin the processes listed next", "PIDS"}, POPT_AUTOALIAS POPT_AUTOHELP POPT_TABLEEND }; static int parse_args(int argc, char ** argv); static int get_pids(int ** pids) { int i; char error[64]; char * copy; char * str_pid; char * end_pid; int pid, n = 0; copy = strdup(program_args.pids); str_pid = strtok(program_args.pids, " \f\n\r\t\v"); if (!program_args.pids) return 0; while (str_pid) { pid = strtol(str_pid, &end_pid, 10); str_pid = strtok(NULL, " \f\n\r\t\v"); if (pid) n++; } *pids = (int *) malloc(n * sizeof(int)); str_pid = strtok(copy, " \f\n\r\t\v"); i = 0; while (str_pid) { pid = strtol(str_pid, &end_pid, 10); if (!pid) { sprintf(error, "Error: %d is not a valid PID", pid); ERROR(error); str_pid = strtok(NULL, " \f\n\r\t\v"); continue; } (*pids)[i] = pid; str_pid = strtok(NULL, " \f\n\r\t\v"); i++; } free(copy); return n; } int main(int argc, char * argv[]) { int i; program_name = argv[0]; i = parse_args(argc, argv); /* do the work */ if (program_args.all) { do_pin_all(!program_args.unpin); } else { int *pids; int n = get_pids(&pids); do_pin_processes(pids, n, !program_args.unpin); free(pids); } if (program_args.pids) free(program_args.pids); return 0; } static int parse_args(int argc, char ** argv) { int option; poptContext context = poptGetContext( NULL, argc, (const char **) argv, program_options, 0); if (argc < 2) { poptPrintUsage(context, error_file, 0); poptFreeContext(context); exit(1); } while ((option = poptGetNextOpt(context)) >= 0) { switch (option) { case 'u': program_args.unpin = 1; break; case 'a': program_args.all = 1; break; default: poptPrintUsage(context, error_file, 0); exit(1); } } if (program_args.all && program_args.pids) { ERROR("Error: -l and -a flags are incompatible\n"); poptPrintUsage(context, error_file, 0); exit(1); } poptFreeContext(context); }/* pin - pin and unpin processes in memory Copyright (C) 2007 Javier Cabezas Rodriguez This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdio.h> #include "error.h" static inline char is_pinned(int pid) { char path[32]; char error[64]; char pinned; char read; sprintf(path, "/proc/%d/pinned", pid); FILE * f = fopen(path, "r"); if (!f) { printf("failed\n"); STDERROR(); return; } read = fscanf(f, "%d", &pinned); if (!read || read == EOF) { printf("failed\n"); sprintf(error, "Error reading from %s", path); ERROR(error); fclose(f); return; } if (fclose(f) == EOF) { printf("failed\n"); STDERROR(); return; } } static void do_pin(int pid) { char path[32]; char error[64]; printf("Pinning %d (%d): ", pid, is_pinned(pid)); sprintf(path, "/proc/%d/pinned", pid); FILE * f = fopen(path, "a"); if (!f) { printf("failed\n"); STDERROR(); return; } if (fprintf(f, "1") <= 0) { printf("failed\n"); sprintf(error, "Error writing to %s", path); ERROR(error); fclose(f); return; } if (fclose(f) == EOF) { printf("failed\n"); STDERROR(); return; } printf("done\n"); } static void do_unpin(int pid) { char path[32]; char error[64]; printf("Unpinning %d (%d): ", pid, is_pinned(pid)); sprintf(path, "/proc/%d/pinned", pid); FILE * f = fopen(path, "a"); if (!f) { printf("failed\n"); STDERROR(); return; } if (fprintf(f, "0") <= 0) { printf("failed\n"); sprintf(error, "Error writing to %s", path); ERROR(error); fclose(f); return; } if (fclose(f) == EOF) { printf("failed\n"); STDERROR(); return; } printf("done\n"); } void do_pin_process(int pid, char pin) { if (pin) do_pin(pid); else do_unpin(pid); } void do_pin_processes(int pids[], int n, char pin) { int i; for (i = 0; i < n; i++) { printf("%d\n", i); do_pin_process(pids[i], pin); } } void do_pin_all(char pin) { }Attachment: signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente
--- End Message ---
--- Begin Message ---
- To: 435546-done@bugs.debian.org
- Subject: Re: Bug#435546: gcc-4.1: Wrong loop code generation using O2
- From: Bastian Blank <waldi@debian.org>
- Date: Thu, 2 Aug 2007 00:37:46 +0200
- Message-id: <20070801223746.GA23700@wavehammer.waldi.eu.org>
- In-reply-to: <[🔎] 49e98fc50708011528h6664cdf9y97b3a6e19a69939@mail.gmail.com>
- References: <[🔎] 1185977773.9574.3.camel@bastion-laptop> <[🔎] 20070801154058.GA19393@wavehammer.waldi.eu.org> <[🔎] 49e98fc50708011528h6664cdf9y97b3a6e19a69939@mail.gmail.com>
On Thu, Aug 02, 2007 at 12:28:37AM +0200, Javier Cabezas Rodríguez wrote: > If I remove the warnings, the generated code is correct. So no but, closing. Bastian -- Bones: "The man's DEAD, Jim!"
--- End Message ---