From patchwork Fri Nov 20 21:03:28 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: romcc changes for mingw32 environment Date: Fri, 20 Nov 2009 21:03:28 -0000 From: Patrick Georgi X-Patchwork-Id: 571 Message-Id: <4B070420.2000503@georgi-clan.de> To: serialice@serialice.com, coreboot@coreboot.org Hi, I succeeded in building the entire SerialICE tool set (host and target) on mingw32. Most changes are in the repository already, but there are two issues in romcc without a clean fix so far, so I thought I'll post the patch for discussion to have it out in public. As they're romcc related, I also added the coreboot list. 1. romcc seems to access memory after free. There's an xfree() call removed in that patch, which is a thinly disguised free() call. With that one removed, free_basic_block(..) works happily, with it present, I get a segfault. Win32 seems to invalidate free'd memory by writing a pattern (0xfeeefeee) there, and that trips up the next pointer deref. There's probably a "sane" fix to that. 2. romcc uses open/read/close to read included files. For some reason, read always returns 0 bytes, so that's an endless loop. I kept the open/stat/close part, and replaced the read with fread (and fopen/fclose to support it). This might be solved in a cleaner way. Patrick Index: util/romcc.c =================================================================== --- util/romcc.c (Revision 58) +++ util/romcc.c (Arbeitskopie) @@ -224,6 +224,7 @@ off_t size, progress; ssize_t result; struct stat stats; + FILE* file; if (!filename) { *r_size = 0; @@ -234,6 +235,7 @@ } xchdir(dirname); fd = open(filename, O_RDONLY); + file = fopen(filename, "rb"); xchdir(cwd); if (fd < 0) { die("Cannot open '%s' : %s\n", @@ -250,8 +252,13 @@ buf[size] = '\n'; /* Make certain the file is newline terminated */ buf[size+1] = '\0'; /* Null terminate the file for good measure */ progress = 0; + result = close(fd); + if (result < 0) { + die("Close of %s failed: %s\n", + filename, strerror(errno)); + } while(progress < size) { - result = read(fd, buf + progress, size - progress); + result = fread(buf + progress, 1, size - progress, file); if (result < 0) { if ((errno == EINTR) || (errno == EAGAIN)) continue; @@ -260,11 +267,7 @@ } progress += result; } - result = close(fd); - if (result < 0) { - die("Close of %s failed: %s\n", - filename, strerror(errno)); - } + fclose(file); return buf; } @@ -15148,7 +15151,6 @@ } } memset(block, -1, sizeof(*block)); - xfree(block); } static void free_basic_blocks(struct compile_state *state,