From 5f2b01ddda00dde792be16144ef9da404594e9c8 Mon Sep 17 00:00:00 2001 From: Alexey Frunze Date: Sun, 30 Aug 2015 23:52:26 -0700 Subject: [PATCH 1/2] Smaller C: improve prologue on MIPS Functions defined as 'type f()' now don't store A0-A3 on the stack just as functions defined as 'type f(void)'. --- src/cmd/smlrc/cgmips.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/smlrc/cgmips.c b/src/cmd/smlrc/cgmips.c index 73ea5d9..2cfde75 100644 --- a/src/cmd/smlrc/cgmips.c +++ b/src/cmd/smlrc/cgmips.c @@ -541,7 +541,7 @@ void GenUpdateFrameSize(void) STATIC void GenFxnProlog(void) { - if (CurFxnParamCntMax) + if (CurFxnParamCntMin && CurFxnParamCntMax) { int i, cnt = CurFxnParamCntMax; if (cnt > 4) From 49de16b343e42bf8ffd70d7df324c99778e0a50b Mon Sep 17 00:00:00 2001 From: Serge Vakulenko Date: Mon, 31 Aug 2015 18:35:37 -0700 Subject: [PATCH 2/2] Fsutil enhanced to extract symlinks. --- tools/fsutil/fsutil.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tools/fsutil/fsutil.c b/tools/fsutil/fsutil.c index 8b6ad24..1d13294 100644 --- a/tools/fsutil/fsutil.c +++ b/tools/fsutil/fsutil.c @@ -247,6 +247,25 @@ void extract_inode (fs_inode_t *inode, char *path) close (fd); } +void extract_symlink (fs_inode_t *inode, char *path) +{ + char data [BSDFS_BSIZE]; + + if (inode->size >= BSDFS_BSIZE) { + fprintf (stderr, "%s: too long symlink\n", path); + return; + } + if (! fs_inode_read (inode, 0, (unsigned char*)data, inode->size)) { + fprintf (stderr, "%s: error reading symlink\n", path); + return; + } + data[inode->size] = 0; + if (symlink(data, path) < 0) { + perror (path); + return; + } +} + void extractor (fs_inode_t *dir, fs_inode_t *inode, char *dirname, char *filename, void *arg) { @@ -257,7 +276,8 @@ void extractor (fs_inode_t *dir, fs_inode_t *inode, print_inode (inode, dirname, filename, out); if ((inode->mode & INODE_MODE_FMT) != INODE_MODE_FDIR && - (inode->mode & INODE_MODE_FMT) != INODE_MODE_FREG) + (inode->mode & INODE_MODE_FMT) != INODE_MODE_FREG && + (inode->mode & INODE_MODE_FMT) != INODE_MODE_FLNK) return; path = alloca (strlen (dirname) + strlen (filename) + 2); @@ -267,13 +287,19 @@ void extractor (fs_inode_t *dir, fs_inode_t *inode, for (relpath=path; *relpath == '/'; relpath++) continue; - if ((inode->mode & INODE_MODE_FMT) == INODE_MODE_FDIR) { + switch (inode->mode & INODE_MODE_FMT) { + case INODE_MODE_FDIR: if (mkdir (relpath, 0775) < 0 && errno != EEXIST) perror (relpath); /* Scan subdirectory. */ fs_directory_scan (inode, path, extractor, arg); - } else { + break; + case INODE_MODE_FREG: extract_inode (inode, relpath); + break; + case INODE_MODE_FLNK: + extract_symlink (inode, relpath); + break; } }