Fixes to compile under Cygwin.
authorSteve Reinhardt <stever@eecs.umich.edu>
Sat, 17 Jun 2006 22:27:28 +0000 (18:27 -0400)
committerSteve Reinhardt <stever@eecs.umich.edu>
Sat, 17 Jun 2006 22:27:28 +0000 (18:27 -0400)
src/kern/linux/linux.hh:
src/kern/solaris/solaris.hh:
    Rename BSD_HOST to the more specific NO_STAT64.
src/sim/byteswap.hh:
    Replace set of swap_byte functions with a single
    templated version.  Hope this fixes compiler issues
    with e.g. int32_t vs int disambiguation.
src/sim/syscall_emul.hh:
    Rename BSD_HOST to the more specific NO_STAT64.
    Set this for __CYGWIN__.

--HG--
extra : convert_revision : 86a63b4b60d2445a566321333381d79ba8ab63c4

src/kern/linux/linux.hh
src/kern/solaris/solaris.hh
src/sim/byteswap.hh
src/sim/syscall_emul.hh

index af5e23b95b1b4497259652fbb3d514429e9654fe..e3f554a22fe0d01127d772028080240768d54ab3 100644 (file)
@@ -69,7 +69,7 @@ class Linux {
     typedef uint32_t gid_t;
     //@}
 
-#if BSD_HOST
+#if NO_STAT64
     typedef struct stat hst_stat;
     typedef struct stat hst_stat64;
 #else
@@ -176,7 +176,7 @@ class Linux {
     /// Helper function to convert a host stat buffer to a target stat
     /// buffer.  Also copies the target buffer out to the simulated
     /// memory space.  Used by stat(), fstat(), and lstat().
-#if !BSD_HOST
+#if !NO_STAT64
     static void
     copyOutStatBuf(TranslatingPort *mem, Addr addr, hst_stat *host)
     {
index 0fec0bcce04c3bea8afb30cf257fdb6a2bb19db1..b819fb6d260e639351ad027ae03ee2f319f92415 100644 (file)
@@ -74,7 +74,7 @@ class Solaris {
     typedef uint32_t nlink_t;
     //@}
 
-#if BSD_HOST
+#if NO_STAT64
     typedef struct stat hst_stat;
     typedef struct stat hst_stat64;
 #else
@@ -177,7 +177,7 @@ class Solaris {
     /// Helper function to convert a host stat buffer to a target stat
     /// buffer.  Also copies the target buffer out to the simulated
     /// memory space.  Used by stat(), fstat(), and lstat().
-#if !BSD_HOST
+#if !NO_STAT64
     static void
     copyOutStatBuf(TranslatingPort *mem, Addr addr, hst_stat *host)
     {
index a3138a25e98df1d494b190291160926e53a6977e..03bfad954c99a2a1eda1a585ab45cf6334f7d257 100644 (file)
@@ -90,25 +90,23 @@ swap_byte16(uint16_t x)
 #endif
 }
 
-//This lets the compiler figure out how to call the swap_byte functions above
-//for different data types.
-static inline uint64_t swap_byte(uint64_t x) {return swap_byte64(x);}
-static inline int64_t swap_byte(int64_t x) {return swap_byte64((uint64_t)x);}
-static inline uint32_t swap_byte(uint32_t x) {return swap_byte32(x);}
-static inline int32_t swap_byte(int32_t x) {return swap_byte32((uint32_t)x);}
-//This is to prevent the following two functions from compiling on
-//64bit machines. It won't detect everything, so it should be changed.
-#ifndef __x86_64__
-static inline long swap_byte(long x) {return swap_byte32((long)x);}
-static inline unsigned long swap_byte(unsigned long x)
-                                { return swap_byte32((unsigned long)x);}
-#endif
-static inline uint16_t swap_byte(uint16_t x) {return swap_byte32(x);}
-static inline int16_t swap_byte(int16_t x) {return swap_byte16((uint16_t)x);}
-static inline uint8_t swap_byte(uint8_t x) {return x;}
-static inline int8_t swap_byte(int8_t x) {return x;}
-static inline double swap_byte(double x) {return swap_byte64((uint64_t)x);}
-static inline float swap_byte(float x) {return swap_byte32((uint32_t)x);}
+// This function lets the compiler figure out how to call the
+// swap_byte functions above for different data types.  Since the
+// sizeof() values are known at compiel time, it should inline to a
+// direct call to the right swap_byteNN() function.
+template <typename T>
+static inline T swap_byte(T x) {
+    if (sizeof(T) == 8)
+        return swap_byte64((uint64_t)x);
+    else if (sizeof(T) == 4)
+        return swap_byte32((uint32_t)x);
+    else if (sizeof(T) == 2)
+        return swap_byte16((uint16_t)x);
+    else if (sizeof(T) == 1)
+        return x;
+    else
+        panic("Can't byte-swap values larger than 64 bits");
+}
 
 //The conversion functions with fixed endianness on both ends don't need to
 //be in a namespace
index f027dbf244316cc706f0104f7fe453db902ff30b..a3990e2fd1300168dc0bac0fcd2e2f7a46041e59 100644 (file)
@@ -33,8 +33,8 @@
 #ifndef __SIM_SYSCALL_EMUL_HH__
 #define __SIM_SYSCALL_EMUL_HH__
 
-#define BSD_HOST (defined(__APPLE__) || defined(__OpenBSD__) || \
-                  defined(__FreeBSD__))
+#define NO_STAT64 (defined(__APPLE__) || defined(__OpenBSD__) || \
+                   defined(__FreeBSD__) || defined(__CYGWIN__))
 
 ///
 /// @file syscall_emul.hh
@@ -507,7 +507,7 @@ fstat64Func(SyscallDesc *desc, int callnum, Process *process,
         return -EBADF;
     }
 
-#if BSD_HOST
+#if NO_STAT64
     struct stat  hostBuf;
     int result = fstat(process->sim_fd(fd), &hostBuf);
 #else
@@ -557,7 +557,7 @@ lstat64Func(SyscallDesc *desc, int callnum, Process *process,
     if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
       return -EFAULT;
 
-#if BSD_HOST
+#if NO_STAT64
     struct stat hostBuf;
     int result = lstat(path.c_str(), &hostBuf);
 #else