Redid the structure packing macros a bit: added __packed, a bunch of comments, and removed a few ugly #ifdefs.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2146 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2009-11-07 14:13:07 +00:00
parent f716232ea8
commit 5f26a90b36
7 changed files with 119 additions and 127 deletions

View File

@ -179,12 +179,46 @@
// Defines the memory page size for the target platform at compilation. All supported platforms // Defines the memory page size for the target platform at compilation. All supported platforms
// (which means Intel only right now) have a 4k granularity. // (which means Intel only right now) have a 4k granularity.
#define PCSX2_PAGESIZE 0x1000 #define PCSX2_PAGESIZE 0x1000
static const int __pagesize = PCSX2_PAGESIZE; static const int __pagesize = PCSX2_PAGESIZE;
//////////////////////////////////////////////////////////////////////////////////////////
// Structure Packing (__packed)
//
// Current Method:
// Use a combination of embedded compiler-specific #pragma mess in conjunction with a
// __packed macro. The former appeases the MSVC gods, the latter appeases the GCC gods.
// The end result looks something like this:
//
// #ifdef _MSC_VER
// # pragma pack(1)
// #endif
//
// struct SomeKindaFail {
// u8 neat;
// u32 unaligned32;
// } __packed;
//
// MSVC 2008 and better support __pragma, however there's no way to support that in
// a way that's backwards compatible to VS 2005, without still including the old-style
// #pragma mess. So there's really not much point (yet) in using it. I've included macros
// that utilize __pragma (commented out below) which can be deployed at a time when we
// are ok with the idea of completely breaking backwards compat with VC2005/prior.
//
// --------------------------------------------------------------------------------------
// Microsoft Visual Studio
// --------------------------------------------------------------------------------------
#ifdef _MSC_VER #ifdef _MSC_VER
// Using these breaks compat with VC2005; so we're not using it yet.
//# define __pack_begin __pragma(pack(1))
//# define __pack_end __pragma(pack())
// This is the 2005/earlier compatible packing define, which must be used in conjunction
// with #ifdef _MSC_VER/#pragma pack() directives (ugly).
# define __packed
# define __aligned(alig) __declspec(align(alig)) # define __aligned(alig) __declspec(align(alig))
# define __aligned16 __declspec(align(16)) # define __aligned16 __declspec(align(16))
# define __pagealigned __declspec(align(PCSX2_PAGESIZE)) # define __pagealigned __declspec(align(PCSX2_PAGESIZE))
@ -205,32 +239,15 @@ static const int __pagesize = PCSX2_PAGESIZE;
# define likely(x) x # define likely(x) x
# define unlikely(x) x # define unlikely(x) x
# define CALLBACK __stdcall # define CALLBACK __stdcall
#else #else
// GCC 4.4.0 is a bit nutty, as compilers go. it gets a define to itself. // --------------------------------------------------------------------------------------
# define GCC_VERSION (__GNUC__ * 10000 \ // GCC / Intel Compilers Section
+ __GNUC_MINOR__ * 100 \ // --------------------------------------------------------------------------------------
+ __GNUC_PATCHLEVEL__)
/* Test for GCC > 4.4.0; Should be adjusted when new versions come out */ # define __packed __attribute__((packed))
# if GCC_VERSION >= 40400
# define THE_UNBEARABLE_LIGHTNESS_OF_BEING_GCC_4_4_0
# define __nooptimization __attribute__((optimize("O0")))
# endif
/*
This theoretically unoptimizes. Not having much luck so far.
# ifdef THE_UNBEARABLE_LIGHTNESS_OF_BEING_GCC_4_4_0
# pragma GCC optimize ("O0")
# endif
# ifdef THE_UNBEARABLE_LIGHTNESS_OF_BEING_GCC_4_4_0
# pragma GCC reset_options
# endif
*/
# define __aligned(alig) __attribute__((aligned(alig))) # define __aligned(alig) __attribute__((aligned(alig)))
# define __aligned16 __attribute__((aligned(16))) # define __aligned16 __attribute__((aligned(16)))

View File

@ -23,29 +23,25 @@
#include "Common.h" #include "Common.h"
#if defined(_MSC_VER) #ifdef _MSC_VER
#pragma pack(1) # pragma pack(1)
#endif #endif
struct TocEntry struct TocEntry
{ {
u32 fileLBA; u32 fileLBA;
u32 fileSize; u32 fileSize;
u8 fileProperties; u8 fileProperties;
u8 padding1[3]; u8 padding1[3];
char filename[128+1]; char filename[128+1];
u8 date[7]; u8 date[7];
#if defined(_MSC_VER) } __packed;
};
#else #ifdef _MSC_VER
} __attribute__((packed)); # pragma pack()
#endif #endif
#if defined(_MSC_VER) extern int IsoFS_findFile(const char* fname, struct TocEntry* tocEntry);
#pragma pack() extern int IsoFS_readSectors(u32 lsn, u32 sectors, void *buf);
#endif
int IsoFS_findFile(const char* fname, struct TocEntry* tocEntry);
int IsoFS_readSectors(u32 lsn, u32 sectors, void *buf);
#endif // _ISOFSCDVD_H #endif // _ISOFSCDVD_H

View File

@ -17,16 +17,14 @@
* Modified by Florin for PCSX2 emu * Modified by Florin for PCSX2 emu
*/ */
#ifndef __ISOFSDRV_H__ #pragma once
#define __ISOFSDRV_H__
#include "IsoFScdvd.h" #include "IsoFScdvd.h"
/* Filing-system exported functions */ /* Filing-system exported functions */
void IsoFS_init(); extern void IsoFS_init();
int IsoFS_open(const char *name, int mode); extern int IsoFS_open(const char *name, int mode);
int IsoFS_lseek(int fd, int offset, int whence); extern int IsoFS_lseek(int fd, int offset, int whence);
int IsoFS_read( int fd, char * buffer, int size ); extern int IsoFS_read( int fd, char * buffer, int size );
int IsoFS_close( int fd); extern int IsoFS_close(int fd);
#endif//__ISOFSDRV_H__

View File

@ -17,19 +17,18 @@
* Modified by Florin for PCSX2 emu * Modified by Florin for PCSX2 emu
*/ */
#ifndef __ISOFSTOOLS_H__ #pragma once
#define __ISOFSTOOLS_H__
#include "IsoFScdvd.h" #include "IsoFScdvd.h"
int IsoFS_initDirectoryList(char* pathname, char* extensions, unsigned int inc_dirs); int IsoFS_initDirectoryList(char* pathname, char* extensions, unsigned int inc_dirs);
int IsoFS_getDirectories(TocEntry tocEntry[], int req_entries); int IsoFS_getDirectories(TocEntry tocEntry[], int req_entries);
#define CD_SECS 60 /* seconds per minute */ static const int CD_SECS = 60; // seconds per minute
#define CD_FRAMES 75 /* frames per second */ static const int CD_FRAMES = 75; // frames per second
#define CD_MSF_OFFSET 150 /* MSF numbering offset of first frame */ static const int CD_MSF_OFFSET = 150; // MSF numbering offset of first frame
#if defined(_MSC_VER) #ifdef _MSC_VER
# pragma pack(1) # pragma pack(1)
#endif #endif
@ -44,11 +43,8 @@ struct rootDirTocHeader
u8 reserved[6]; //+1A u8 reserved[6]; //+1A
u8 reserved2; //+20 u8 reserved2; //+20
u8 reserved3; //+21 u8 reserved3; //+21
#if defined(_MSC_VER)
}; //+22 } __packed; //+22
#else
} __attribute__((packed));
#endif
struct asciiDate struct asciiDate
{ {
@ -60,11 +56,7 @@ struct asciiDate
char seconds[2]; char seconds[2];
char hundreths[2]; char hundreths[2];
char terminator[1]; char terminator[1];
#if defined(_MSC_VER) } __packed;
};
#else
} __attribute__((packed));
#endif
struct cdVolDesc struct cdVolDesc
{ {
@ -80,6 +72,7 @@ struct cdVolDesc
u8 reserved6[32]; u8 reserved6[32];
u32 unknown1; u32 unknown1;
u32 unknown1_bigend; u32 unknown1_bigend;
u16 volDescSize; //+80 u16 volDescSize; //+80
u16 volDescSize_bigend; //+82 u16 volDescSize_bigend; //+82
u32 unknown3; //+84 u32 unknown3; //+84
@ -88,7 +81,9 @@ struct cdVolDesc
u32 reserved7; //+90 u32 reserved7; //+90
u32 secDirTableLBA; // LBA of Secondary Dir Table //+94 u32 secDirTableLBA; // LBA of Secondary Dir Table //+94
u32 reserved8; //+98 u32 reserved8; //+98
struct rootDirTocHeader rootToc;
rootDirTocHeader rootToc;
s8 volSetName[128]; s8 volSetName[128];
s8 publisherName[128]; s8 publisherName[128];
s8 preparerName[128]; s8 preparerName[128];
@ -96,17 +91,15 @@ struct cdVolDesc
s8 copyrightFileName[37]; s8 copyrightFileName[37];
s8 abstractFileName[37]; s8 abstractFileName[37];
s8 bibliographyFileName[37]; s8 bibliographyFileName[37];
struct asciiDate creationDate;
struct asciiDate modificationDate; asciiDate creationDate;
struct asciiDate effectiveDate; asciiDate modificationDate;
struct asciiDate expirationDate; asciiDate effectiveDate;
asciiDate expirationDate;
u8 reserved10; u8 reserved10;
u8 reserved11[1166]; u8 reserved11[1166];
#if defined(_MSC_VER) } __packed;
};
#else
} __attribute__((packed));
#endif
struct dirTableEntry struct dirTableEntry
{ {
@ -115,34 +108,30 @@ struct dirTableEntry
u32 dirTOCLBA; u32 dirTOCLBA;
u16 dirDepth; u16 dirDepth;
u8 dirName[32]; u8 dirName[32];
#if defined(_MSC_VER) } __packed;
};
#else // --------------------------------------------------------------------------------------
} __attribute__((packed)); // dirTocEntry
#endif // --------------------------------------------------------------------------------------
// This is the internal Table of Contents, as found on the CD
// TocEntry structure contains only the important stuff needed for export.
struct dirTocEntry struct dirTocEntry
{ {
short length; s16 length;
u32 fileLBA; u32 fileLBA;
u32 fileLBA_bigend; u32 fileLBA_bigend;
u32 fileSize; u32 fileSize;
u32 fileSize_bigend; u32 fileSize_bigend;
u8 dateStamp[6]; u8 dateStamp[6];
u8 reserved1; u8 reserved1;
u8 fileProperties; u8 fileProperties;
u8 reserved2[6]; u8 reserved2[6];
u8 filenameLength; u8 filenameLength;
char filename[128];
#if defined(_MSC_VER)
};
#else
} __attribute__((packed));
#endif // This is the internal format on the CD
// TocEntry structure contains only the important stuff needed for export
#if defined(_MSC_VER) char filename[128];
#pragma pack() } __packed;
#ifdef _MSC_VER
# pragma pack()
#endif #endif
#endif//__ISOFSTOOLS_H__

View File

@ -1016,13 +1016,10 @@ struct TGA_HEADER
u8 descriptor; // image descriptor bits (vh flip bits) u8 descriptor; // image descriptor bits (vh flip bits)
// pixel data follows header // pixel data follows header
} __packed;
#if defined(_MSC_VER) #if defined(_MSC_VER)
}; # pragma pack()
#pragma pack()
#else
} __attribute__((packed));
#endif #endif
void SaveTGA(const char* filename, int width, int height, void* pdata) void SaveTGA(const char* filename, int width, int height, void* pdata)

View File

@ -26,18 +26,18 @@
// romdir structure (packing required!) // romdir structure (packing required!)
// //
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma pack(1) # pragma pack(1)
#endif #endif
struct romdir struct romdir
{ {
char fileName[10]; char fileName[10];
u16 extInfoSize; u16 extInfoSize;
u32 fileSize; u32 fileSize;
#if defined(_MSC_VER) } __packed; // +22
};
#pragma pack() //+22 #ifdef _MSC_VER
#else # pragma pack()
} __attribute__((packed));
#endif #endif
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////

View File

@ -25,12 +25,12 @@ union regInfo {
}; };
}; };
#if defined(_MSC_VER) #ifdef _MSC_VER
#pragma pack(1) # pragma pack(1)
#pragma warning(disable:4996) # pragma warning(disable:4996) // 'function': was declared deprecated
#endif #endif
__declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares __aligned16 struct microRegInfo { // Ordered for Faster Compares
u32 vi15; // Constant Prop Info for vi15 (only valid if sign-bit set) u32 vi15; // Constant Prop Info for vi15 (only valid if sign-bit set)
u8 needExactMatch; // If set, block needs an exact match of pipeline state u8 needExactMatch; // If set, block needs an exact match of pipeline state
u8 q; u8 q;
@ -43,21 +43,16 @@ __declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares
u8 flags; // clip x2 :: status x2 u8 flags; // clip x2 :: status x2
u8 blockType; // 0 = Normal; 1,2 = Compile one instruction (E-bit/Branch Ending) u8 blockType; // 0 = Normal; 1,2 = Compile one instruction (E-bit/Branch Ending)
u8 padding[5]; // 160 bytes u8 padding[5]; // 160 bytes
#if defined(_MSC_VER) } __packed;
};
#else
} __attribute__((packed));
#endif
__declspec(align(16)) struct microBlock { __aligned16 struct microBlock {
microRegInfo pState; // Detailed State of Pipeline microRegInfo pState; // Detailed State of Pipeline
microRegInfo pStateEnd; // Detailed State of Pipeline at End of Block (needed by JR/JALR opcodes) microRegInfo pStateEnd; // Detailed State of Pipeline at End of Block (needed by JR/JALR opcodes)
u8* x86ptrStart; // Start of code u8* x86ptrStart; // Start of code
#if defined(_MSC_VER) } __packed;
};
#pragma pack() #ifdef _MSC_VER
#else # pragma pack()
} __attribute__((packed));
#endif #endif
struct microTempRegInfo { struct microTempRegInfo {