abiStuff.h

Go to the documentation of this file.
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     // optional values like x86, x86-64, ia64, sparcv9, sparcv8 etc.
00016     std::string str_abi; 
00017     //Primitive types: redundant if ABI is specified.  
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; // memory handle
00037     size_t sz_alignof_pointer;
00038     size_t sz_reference; 
00039     size_t sz_alignof_reference;
00040 
00041    //Extended types beyond ABI's scope
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     //UPC specified sizes
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 // modifiers
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      // DQ (11/27/2009): MSVC reports a warning when "this" is used in the preinitialization list.
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 // Handles structs and unions only
00147 // Does not handle C++ stuff (inheritance, virtual functions) for now
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 /* Is type being laid out a union? */, 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

Generated on Tue Jan 31 05:31:19 2012 for ROSE by  doxygen 1.4.7