00001 #ifndef ROSE_ABISTUFF_H
00002 #define ROSE_ABISTUFF_H
00003
00004
00005 #include <vector>
00006 #include <string>
00007 #include <iosfwd>
00008
00010
00013 struct StructCustomizedSizes
00014 {
00015
00016 std::string str_abi;
00017
00018 size_t sz_bool;
00019 size_t sz_alignof_bool;
00020 size_t sz_char;
00021 size_t sz_alignof_char;
00022 size_t sz_int;
00023 size_t sz_alignof_int;
00024 size_t sz_short;
00025 size_t sz_alignof_short;
00026 size_t sz_long;
00027 size_t sz_alignof_long;
00028 size_t sz_longlong;
00029 size_t sz_alignof_longlong;
00030 size_t sz_float;
00031 size_t sz_alignof_float;
00032 size_t sz_double;
00033 size_t sz_alignof_double;
00034 size_t sz_longdouble;
00035 size_t sz_alignof_longdouble;
00036 size_t sz_pointer;
00037 size_t sz_alignof_pointer;
00038 size_t sz_reference;
00039 size_t sz_alignof_reference;
00040
00041
00042 size_t sz_void_ptr;
00043 size_t sz_alignof_void_ptr;
00044 size_t sz_ptrdiff_t;
00045 size_t sz_alignof_ptrdiff_t;
00046 size_t sz_size_t;
00047 size_t sz_alignof_size_t;
00048 size_t sz_wchar;
00049 size_t sz_alignof_wchar;
00050
00051
00052 size_t sz_shared_ptr;
00053 size_t sz_alignof_shared_ptr;
00054 size_t sz_pshared_ptr;
00055 size_t sz_alignof_pshared_ptr;
00056 size_t sz_mem_handle;
00057 size_t sz_alignof_mem_handle;
00058 size_t sz_reg_handle;
00059 size_t sz_alignof_reg_handle;
00060
00061 size_t sz_alignof_dbl_1st;
00062 size_t sz_alignof_int64_1st;
00063 size_t sz_alignof_sharedptr_1st ;
00064 size_t sz_alignof_psharedptr_1st ;
00065 size_t sz_alignof_dbl_innerstruct;
00066 size_t sz_alignof_int64_innerstruct;
00067 size_t sz_alignof_sharedptr_innerstruct ;
00068 size_t sz_alignof_psharedptr_innerstruct;
00069 size_t sz_maxblocksz;
00070 };
00071
00072 struct StructLayoutEntry {
00077 SgNode* decl;
00080 size_t byteOffset;
00082 size_t fieldSize;
00084 size_t bitFieldContainerSize;
00087 size_t bitOffset;
00088
00089 StructLayoutEntry(SgNode* decl, size_t byteOffset, size_t fieldSize, size_t bitFieldContainerSize = 0, size_t bitOffset = 0):
00090 decl(decl), byteOffset(byteOffset), fieldSize(fieldSize), bitFieldContainerSize(bitFieldContainerSize), bitOffset(bitOffset) {}
00091 };
00092
00093 struct StructLayoutInfo {
00095 size_t size;
00097 size_t alignment;
00099 std::vector<StructLayoutEntry> fields;
00100
00101 StructLayoutInfo(): size(0), alignment(0), fields() {}
00102 };
00103
00104 std::ostream& operator<<(std::ostream& o, const StructLayoutEntry& e);
00105 std::ostream& operator<<(std::ostream& o, const StructLayoutInfo& i);
00106
00108
00109 class ChainableTypeLayoutGenerator {
00110 public:
00111 virtual ~ChainableTypeLayoutGenerator() {}
00112 ChainableTypeLayoutGenerator* next;
00113 ChainableTypeLayoutGenerator* beginning;
00114 StructCustomizedSizes* custom_sizes;
00115
00116 ChainableTypeLayoutGenerator(ChainableTypeLayoutGenerator* nx, StructCustomizedSizes* sizes=NULL)
00117 #ifdef _MSC_VER
00118 : next(NULL), beginning(NULL), custom_sizes(sizes)
00119 {
00120
00121 beginning = this;
00122 this->setNext(nx);
00123 }
00124 #else
00125 : next(NULL), beginning(this), custom_sizes(sizes)
00126 {
00127 this->setNext(nx);
00128 }
00129 #endif
00130
00131 protected:
00132 void setNext(ChainableTypeLayoutGenerator* nx) {
00133 this->next = nx;
00134 if (nx) nx->setBeginningRecursively(this->beginning);
00135 }
00136 void setBeginningRecursively(ChainableTypeLayoutGenerator* bg) {
00137 this->beginning = bg;
00138 if (this->next) this->next->setBeginningRecursively(bg);
00139 }
00140
00141 public:
00142 virtual StructLayoutInfo layoutType(SgType* t) const;
00143 };
00144
00146
00147
00148 class NonpackedTypeLayoutGenerator: public ChainableTypeLayoutGenerator {
00149 public:
00150 NonpackedTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00151 : ChainableTypeLayoutGenerator(next)
00152 {}
00153 virtual StructLayoutInfo layoutType(SgType* t) const;
00154
00155 private:
00156 void layoutOneField(SgType* fieldType, SgNode* decl, bool isUnion , size_t& currentOffset, StructLayoutInfo& layout) const;
00157 };
00158
00160 class I386PrimitiveTypeLayoutGenerator: public ChainableTypeLayoutGenerator {
00161 public:
00162 I386PrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00163 : ChainableTypeLayoutGenerator(next)
00164 {}
00165 virtual StructLayoutInfo layoutType(SgType* t) const;
00166 };
00167
00169 class I386_VSPrimitiveTypeLayoutGenerator: public I386PrimitiveTypeLayoutGenerator {
00170 public:
00171 I386_VSPrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00172 : I386PrimitiveTypeLayoutGenerator(next)
00173 {}
00174 virtual StructLayoutInfo layoutType(SgType* t) const;
00175 };
00176
00178 class X86_64PrimitiveTypeLayoutGenerator: public ChainableTypeLayoutGenerator {
00179 public:
00180 X86_64PrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00181 : ChainableTypeLayoutGenerator(next)
00182 {}
00183 virtual StructLayoutInfo layoutType(SgType* t) const;
00184 };
00185
00187 class X86_64_VSPrimitiveTypeLayoutGenerator: public X86_64PrimitiveTypeLayoutGenerator {
00188 public:
00189 X86_64_VSPrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00190 : X86_64PrimitiveTypeLayoutGenerator(next)
00191 {}
00192 virtual StructLayoutInfo layoutType(SgType* t) const;
00193 };
00194
00196 class SystemPrimitiveTypeLayoutGenerator: public ChainableTypeLayoutGenerator {
00197 public:
00198 SystemPrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next)
00199 : ChainableTypeLayoutGenerator(next)
00200 {}
00201 virtual StructLayoutInfo layoutType(SgType* t) const;
00202 };
00203
00205 class CustomizedPrimitiveTypeLayoutGenerator: public ChainableTypeLayoutGenerator {
00206 public:
00207 CustomizedPrimitiveTypeLayoutGenerator(ChainableTypeLayoutGenerator* next,StructCustomizedSizes* custom_sizes)
00208 : ChainableTypeLayoutGenerator(next,custom_sizes)
00209 {}
00210 virtual StructLayoutInfo layoutType(SgType* t) const;
00211 };
00212
00213
00214 #endif // ROSE_ABISTUFF_H