00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_CODEGEN_CVALUE_HDR_GUARD
00010 #define COMMA_CODEGEN_CVALUE_HDR_GUARD
00011
00012 #include "llvm/ADT/PointerIntPair.h"
00013 #include "llvm/Value.h"
00014
00015 namespace comma {
00016
00017
00018
00019
00025 class CValue {
00026
00027 public:
00029 CValue() { }
00030
00036 enum Kind {
00037 Simple,
00038 Aggregate,
00039 Fat
00040 };
00041
00043
00044 llvm::Value *first() { return primary; }
00045 const llvm::Value *first() const { return primary; }
00047
00049
00050 llvm::Value *second() { return secondary.getPointer(); }
00051 const llvm::Value *second() const { return secondary.getPointer(); }
00053
00055 bool isSimple() const { return secondary.getInt() == Simple; }
00056
00058 bool isAggregate() const { return secondary.getInt() == Aggregate; }
00059
00061 bool isArray() const { return isAggregate() && second() != 0; }
00062
00064 bool isFat() const { return secondary.getInt() == Fat; }
00065
00067
00068 static CValue get(llvm::Value *V1) {
00069 return CValue(V1, 0, Simple);
00070 }
00071
00072 static CValue getArray(llvm::Value *V1, llvm::Value *V2) {
00073 return CValue(V1, V2, Aggregate);
00074 }
00075
00076 static CValue getRecord(llvm::Value *V1) {
00077 return CValue(V1, 0, Aggregate);
00078 }
00079
00080 static CValue getFat(llvm::Value *V1) {
00081 return CValue(V1, 0, Fat);
00082 }
00084
00085 private:
00087 CValue(llvm::Value *V1, llvm::Value *V2, Kind kind)
00088 : primary(V1), secondary(V2, kind) { }
00089
00093 llvm::Value *primary;
00094 llvm::PointerIntPair<llvm::Value*, 2, Kind> secondary;
00095 };
00096
00097 }
00098
00099 #endif
00100