1 //===- GenericValue.h - Represent any type of LLVM value --------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // The GenericValue class is used to represent an LLVM value of arbitrary type. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_EXECUTIONENGINE_GENERICVALUE_H 15 #define LLVM_EXECUTIONENGINE_GENERICVALUE_H 16 17 #include "llvm/ADT/APInt.h" 18 #include <vector> 19 20 namespace llvm { 21 22 using PointerTy = void *; 23 24 struct GenericValue { 25 struct IntPair { 26 unsigned int first; 27 unsigned int second; 28 }; 29 union { 30 double DoubleVal; 31 float FloatVal; 32 PointerTy PointerVal; 33 struct IntPair UIntPairVal; 34 unsigned char Untyped[8]; 35 }; 36 APInt IntVal; // also used for long doubles. 37 // For aggregate data types. 38 std::vector<GenericValue> AggregateVal; 39 40 // to make code faster, set GenericValue to zero could be omitted, but it is 41 // potentially can cause problems, since GenericValue to store garbage 42 // instead of zero. GenericValueGenericValue43 GenericValue() : IntVal(1, 0) { 44 UIntPairVal.first = 0; 45 UIntPairVal.second = 0; 46 } GenericValueGenericValue47 explicit GenericValue(void *V) : PointerVal(V), IntVal(1, 0) {} 48 }; 49 PTOGV(void * P)50inline GenericValue PTOGV(void *P) { return GenericValue(P); } GVTOP(const GenericValue & GV)51inline void *GVTOP(const GenericValue &GV) { return GV.PointerVal; } 52 53 } // end namespace llvm 54 55 #endif // LLVM_EXECUTIONENGINE_GENERICVALUE_H 56