ExecutionEngine.cpp revision 9a23122b6a4decff3d3f10cb8d9b5ccebe5c7474
10832f82f763185767d63ae4bf05021c5630c155fJordan Rose//===-- ExecutionEngine.cpp - Common Implementation shared by EE's --------===// 20832f82f763185767d63ae4bf05021c5630c155fJordan Rose// 30832f82f763185767d63ae4bf05021c5630c155fJordan Rose// This file defines the common interface used by the various execution engine 40832f82f763185767d63ae4bf05021c5630c155fJordan Rose// subclasses. 50832f82f763185767d63ae4bf05021c5630c155fJordan Rose// 60832f82f763185767d63ae4bf05021c5630c155fJordan Rose//===----------------------------------------------------------------------===// 70832f82f763185767d63ae4bf05021c5630c155fJordan Rose 80832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "ExecutionEngine.h" 90832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "GenericValue.h" 100832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/DerivedTypes.h" 110832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/Constants.h" 120832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/Module.h" 130832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "llvm/Target/TargetData.h" 140832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include "Support/Statistic.h" 150832f82f763185767d63ae4bf05021c5630c155fJordan Rose#include <dlfcn.h> 160832f82f763185767d63ae4bf05021c5630c155fJordan Rose 170832f82f763185767d63ae4bf05021c5630c155fJordan RoseStatistic<> NumInitBytes("lli", "Number of bytes of global vars initialized"); 180832f82f763185767d63ae4bf05021c5630c155fJordan Rose 190832f82f763185767d63ae4bf05021c5630c155fJordan Rose// getPointerToGlobal - This returns the address of the specified global 200832f82f763185767d63ae4bf05021c5630c155fJordan Rose// value. This may involve code generation if it's a function. 210832f82f763185767d63ae4bf05021c5630c155fJordan Rose// 220832f82f763185767d63ae4bf05021c5630c155fJordan Rosevoid *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) { 230832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (const Function *F = dyn_cast<Function>(GV)) 24e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose return getPointerToFunction(F); 250832f82f763185767d63ae4bf05021c5630c155fJordan Rose 260832f82f763185767d63ae4bf05021c5630c155fJordan Rose assert(GlobalAddress[GV] && "Global hasn't had an address allocated yet?"); 270832f82f763185767d63ae4bf05021c5630c155fJordan Rose return GlobalAddress[GV]; 280832f82f763185767d63ae4bf05021c5630c155fJordan Rose} 290832f82f763185767d63ae4bf05021c5630c155fJordan Rose 300832f82f763185767d63ae4bf05021c5630c155fJordan Rose 310832f82f763185767d63ae4bf05021c5630c155fJordan RoseGenericValue ExecutionEngine::getConstantValue(const Constant *C) { 320832f82f763185767d63ae4bf05021c5630c155fJordan Rose GenericValue Result; 330832f82f763185767d63ae4bf05021c5630c155fJordan Rose 340832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (ConstantExpr *CE = const_cast<ConstantExpr*>(dyn_cast<ConstantExpr>(C))) { 350832f82f763185767d63ae4bf05021c5630c155fJordan Rose switch (CE->getOpcode()) { 360832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Instruction::GetElementPtr: { 370832f82f763185767d63ae4bf05021c5630c155fJordan Rose Result = getConstantValue(CE->getOperand(0)); 380832f82f763185767d63ae4bf05021c5630c155fJordan Rose std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end()); 390832f82f763185767d63ae4bf05021c5630c155fJordan Rose uint64_t Offset = 400832f82f763185767d63ae4bf05021c5630c155fJordan Rose TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes); 410832f82f763185767d63ae4bf05021c5630c155fJordan Rose 420832f82f763185767d63ae4bf05021c5630c155fJordan Rose Result.LongVal += Offset; 430832f82f763185767d63ae4bf05021c5630c155fJordan Rose return Result; 440832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 450832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Instruction::Cast: { 460832f82f763185767d63ae4bf05021c5630c155fJordan Rose // We only need to handle a few cases here. Almost all casts will 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // automatically fold, just the ones involving pointers won't. 480832f82f763185767d63ae4bf05021c5630c155fJordan Rose // 490832f82f763185767d63ae4bf05021c5630c155fJordan Rose Constant *Op = CE->getOperand(0); 500832f82f763185767d63ae4bf05021c5630c155fJordan Rose 510832f82f763185767d63ae4bf05021c5630c155fJordan Rose // Handle cast of pointer to pointer... 520832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (Op->getType()->getPrimitiveID() == C->getType()->getPrimitiveID()) 530832f82f763185767d63ae4bf05021c5630c155fJordan Rose return getConstantValue(Op); 540832f82f763185767d63ae4bf05021c5630c155fJordan Rose 550832f82f763185767d63ae4bf05021c5630c155fJordan Rose // Handle cast of long to pointer or pointer to long... 560832f82f763185767d63ae4bf05021c5630c155fJordan Rose if ((isa<PointerType>(Op->getType()) && (C->getType() == Type::LongTy || 570832f82f763185767d63ae4bf05021c5630c155fJordan Rose C->getType() == Type::ULongTy))|| 580832f82f763185767d63ae4bf05021c5630c155fJordan Rose (isa<PointerType>(C->getType()) && (Op->getType() == Type::LongTy || 590832f82f763185767d63ae4bf05021c5630c155fJordan Rose Op->getType() == Type::ULongTy))){ 600832f82f763185767d63ae4bf05021c5630c155fJordan Rose return getConstantValue(Op); 610832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 620832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 630832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 6402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor 650832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Instruction::Add: 660832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (C->getOperand(0)->getType() == Type::LongTy || 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C->getOperand(0)->getType() == Type::ULongTy) 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Result.LongVal = getConstantValue(C->getOperand(0)).LongVal + 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getConstantValue(C->getOperand(1)).LongVal; 700832f82f763185767d63ae4bf05021c5630c155fJordan Rose else 710832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 720832f82f763185767d63ae4bf05021c5630c155fJordan Rose return Result; 730832f82f763185767d63ae4bf05021c5630c155fJordan Rose 740832f82f763185767d63ae4bf05021c5630c155fJordan Rose default: 75d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva break; 760832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 770832f82f763185767d63ae4bf05021c5630c155fJordan Rose std::cerr << "ConstantExpr not handled as global var init: " << *CE << "\n"; 780832f82f763185767d63ae4bf05021c5630c155fJordan Rose abort(); 790832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 800832f82f763185767d63ae4bf05021c5630c155fJordan Rose 810832f82f763185767d63ae4bf05021c5630c155fJordan Rose switch (C->getType()->getPrimitiveID()) { 820832f82f763185767d63ae4bf05021c5630c155fJordan Rose#define GET_CONST_VAL(TY, CLASS) \ 830832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break 840832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Bool , ConstantBool); 850832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(UByte , ConstantUInt); 860832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(SByte , ConstantSInt); 870832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(UShort , ConstantUInt); 880832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Short , ConstantSInt); 890832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(UInt , ConstantUInt); 900832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Int , ConstantSInt); 910832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(ULong , ConstantUInt); 920832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Long , ConstantSInt); 930832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Float , ConstantFP); 940832f82f763185767d63ae4bf05021c5630c155fJordan Rose GET_CONST_VAL(Double , ConstantFP); 950832f82f763185767d63ae4bf05021c5630c155fJordan Rose#undef GET_CONST_VAL 960832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::PointerTyID: 970832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (isa<ConstantPointerNull>(C)) { 980832f82f763185767d63ae4bf05021c5630c155fJordan Rose Result.PointerVal = 0; 990832f82f763185767d63ae4bf05021c5630c155fJordan Rose } else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)){ 1000832f82f763185767d63ae4bf05021c5630c155fJordan Rose Result = PTOGV(getPointerToGlobal(CPR->getValue())); 1010832f82f763185767d63ae4bf05021c5630c155fJordan Rose 1020832f82f763185767d63ae4bf05021c5630c155fJordan Rose } else { 1030832f82f763185767d63ae4bf05021c5630c155fJordan Rose assert(0 && "Unknown constant pointer type!"); 1040832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 1050832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 1060832f82f763185767d63ae4bf05021c5630c155fJordan Rose default: 1070832f82f763185767d63ae4bf05021c5630c155fJordan Rose std::cout << "ERROR: Constant unimp for type: " << C->getType() << "\n"; 1080832f82f763185767d63ae4bf05021c5630c155fJordan Rose abort(); 1090832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 1100832f82f763185767d63ae4bf05021c5630c155fJordan Rose return Result; 1110832f82f763185767d63ae4bf05021c5630c155fJordan Rose} 1120832f82f763185767d63ae4bf05021c5630c155fJordan Rose 113e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rosevoid ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, 1140832f82f763185767d63ae4bf05021c5630c155fJordan Rose const Type *Ty) { 1150832f82f763185767d63ae4bf05021c5630c155fJordan Rose if (getTargetData().isLittleEndian()) { 116e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose switch (Ty->getPrimitiveID()) { 117e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose case Type::BoolTyID: 118e7427636767501903cfa51ccecafa7a4795a23c2Jordan Rose case Type::UByteTyID: 1190832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break; 1200832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::UShortTyID: 1210832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::ShortTyID: Ptr->Untyped[0] = Val.UShortVal & 255; 1220832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[1] = (Val.UShortVal >> 8) & 255; 1230832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 1240832f82f763185767d63ae4bf05021c5630c155fJordan Rose Store4BytesLittleEndian: 1250832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::FloatTyID: 1260832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::UIntTyID: 1270832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::IntTyID: Ptr->Untyped[0] = Val.UIntVal & 255; 1280832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[1] = (Val.UIntVal >> 8) & 255; 1290832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[2] = (Val.UIntVal >> 16) & 255; 1300832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[3] = (Val.UIntVal >> 24) & 255; 1310832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 1320832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::PointerTyID: if (CurMod.has32BitPointers()) 1330832f82f763185767d63ae4bf05021c5630c155fJordan Rose goto Store4BytesLittleEndian; 1340832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::DoubleTyID: 1350832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::ULongTyID: 1360832f82f763185767d63ae4bf05021c5630c155fJordan Rose case Type::LongTyID: Ptr->Untyped[0] = Val.ULongVal & 255; 1370832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[1] = (Val.ULongVal >> 8) & 255; 1380832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[2] = (Val.ULongVal >> 16) & 255; 1390832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[3] = (Val.ULongVal >> 24) & 255; 1400832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[4] = (Val.ULongVal >> 32) & 255; 1410832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[5] = (Val.ULongVal >> 40) & 255; 1420832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[6] = (Val.ULongVal >> 48) & 255; 1430832f82f763185767d63ae4bf05021c5630c155fJordan Rose Ptr->Untyped[7] = (Val.ULongVal >> 56) & 255; 1440832f82f763185767d63ae4bf05021c5630c155fJordan Rose break; 1450832f82f763185767d63ae4bf05021c5630c155fJordan Rose default: 1460832f82f763185767d63ae4bf05021c5630c155fJordan Rose std::cout << "Cannot store value of type " << Ty << "!\n"; 1470832f82f763185767d63ae4bf05021c5630c155fJordan Rose } 1480832f82f763185767d63ae4bf05021c5630c155fJordan Rose } else { 149 switch (Ty->getPrimitiveID()) { 150 case Type::BoolTyID: 151 case Type::UByteTyID: 152 case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break; 153 case Type::UShortTyID: 154 case Type::ShortTyID: Ptr->Untyped[1] = Val.UShortVal & 255; 155 Ptr->Untyped[0] = (Val.UShortVal >> 8) & 255; 156 break; 157 Store4BytesBigEndian: 158 case Type::FloatTyID: 159 case Type::UIntTyID: 160 case Type::IntTyID: Ptr->Untyped[3] = Val.UIntVal & 255; 161 Ptr->Untyped[2] = (Val.UIntVal >> 8) & 255; 162 Ptr->Untyped[1] = (Val.UIntVal >> 16) & 255; 163 Ptr->Untyped[0] = (Val.UIntVal >> 24) & 255; 164 break; 165 case Type::PointerTyID: if (CurMod.has32BitPointers()) 166 goto Store4BytesBigEndian; 167 case Type::DoubleTyID: 168 case Type::ULongTyID: 169 case Type::LongTyID: Ptr->Untyped[7] = Val.ULongVal & 255; 170 Ptr->Untyped[6] = (Val.ULongVal >> 8) & 255; 171 Ptr->Untyped[5] = (Val.ULongVal >> 16) & 255; 172 Ptr->Untyped[4] = (Val.ULongVal >> 24) & 255; 173 Ptr->Untyped[3] = (Val.ULongVal >> 32) & 255; 174 Ptr->Untyped[2] = (Val.ULongVal >> 40) & 255; 175 Ptr->Untyped[1] = (Val.ULongVal >> 48) & 255; 176 Ptr->Untyped[0] = (Val.ULongVal >> 56) & 255; 177 break; 178 default: 179 std::cout << "Cannot store value of type " << Ty << "!\n"; 180 } 181 } 182} 183 184GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr, 185 const Type *Ty) { 186 GenericValue Result; 187 if (getTargetData().isLittleEndian()) { 188 switch (Ty->getPrimitiveID()) { 189 case Type::BoolTyID: 190 case Type::UByteTyID: 191 case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break; 192 case Type::UShortTyID: 193 case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[0] | 194 ((unsigned)Ptr->Untyped[1] << 8); 195 break; 196 Load4BytesLittleEndian: 197 case Type::FloatTyID: 198 case Type::UIntTyID: 199 case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[0] | 200 ((unsigned)Ptr->Untyped[1] << 8) | 201 ((unsigned)Ptr->Untyped[2] << 16) | 202 ((unsigned)Ptr->Untyped[3] << 24); 203 break; 204 case Type::PointerTyID: if (getModule().has32BitPointers()) 205 goto Load4BytesLittleEndian; 206 case Type::DoubleTyID: 207 case Type::ULongTyID: 208 case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[0] | 209 ((uint64_t)Ptr->Untyped[1] << 8) | 210 ((uint64_t)Ptr->Untyped[2] << 16) | 211 ((uint64_t)Ptr->Untyped[3] << 24) | 212 ((uint64_t)Ptr->Untyped[4] << 32) | 213 ((uint64_t)Ptr->Untyped[5] << 40) | 214 ((uint64_t)Ptr->Untyped[6] << 48) | 215 ((uint64_t)Ptr->Untyped[7] << 56); 216 break; 217 default: 218 std::cout << "Cannot load value of type " << *Ty << "!\n"; 219 abort(); 220 } 221 } else { 222 switch (Ty->getPrimitiveID()) { 223 case Type::BoolTyID: 224 case Type::UByteTyID: 225 case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break; 226 case Type::UShortTyID: 227 case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[1] | 228 ((unsigned)Ptr->Untyped[0] << 8); 229 break; 230 Load4BytesBigEndian: 231 case Type::FloatTyID: 232 case Type::UIntTyID: 233 case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[3] | 234 ((unsigned)Ptr->Untyped[2] << 8) | 235 ((unsigned)Ptr->Untyped[1] << 16) | 236 ((unsigned)Ptr->Untyped[0] << 24); 237 break; 238 case Type::PointerTyID: if (getModule().has32BitPointers()) 239 goto Load4BytesBigEndian; 240 case Type::DoubleTyID: 241 case Type::ULongTyID: 242 case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[7] | 243 ((uint64_t)Ptr->Untyped[6] << 8) | 244 ((uint64_t)Ptr->Untyped[5] << 16) | 245 ((uint64_t)Ptr->Untyped[4] << 24) | 246 ((uint64_t)Ptr->Untyped[3] << 32) | 247 ((uint64_t)Ptr->Untyped[2] << 40) | 248 ((uint64_t)Ptr->Untyped[1] << 48) | 249 ((uint64_t)Ptr->Untyped[0] << 56); 250 break; 251 default: 252 std::cout << "Cannot load value of type " << *Ty << "!\n"; 253 abort(); 254 } 255 } 256 return Result; 257} 258 259 260// InitializeMemory - Recursive function to apply a Constant value into the 261// specified memory location... 262// 263void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { 264 if (Init->getType()->isFirstClassType()) { 265 GenericValue Val = getConstantValue(Init); 266 StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); 267 return; 268 } 269 270 switch (Init->getType()->getPrimitiveID()) { 271 case Type::ArrayTyID: { 272 const ConstantArray *CPA = cast<ConstantArray>(Init); 273 const std::vector<Use> &Val = CPA->getValues(); 274 unsigned ElementSize = 275 getTargetData().getTypeSize(cast<ArrayType>(CPA->getType())->getElementType()); 276 for (unsigned i = 0; i < Val.size(); ++i) 277 InitializeMemory(cast<Constant>(Val[i].get()), (char*)Addr+i*ElementSize); 278 return; 279 } 280 281 case Type::StructTyID: { 282 const ConstantStruct *CPS = cast<ConstantStruct>(Init); 283 const StructLayout *SL = 284 getTargetData().getStructLayout(cast<StructType>(CPS->getType())); 285 const std::vector<Use> &Val = CPS->getValues(); 286 for (unsigned i = 0; i < Val.size(); ++i) 287 InitializeMemory(cast<Constant>(Val[i].get()), 288 (char*)Addr+SL->MemberOffsets[i]); 289 return; 290 } 291 292 default: 293 std::cerr << "Bad Type: " << Init->getType() << "\n"; 294 assert(0 && "Unknown constant type to initialize memory with!"); 295 } 296} 297 298 299 300void *ExecutionEngine::CreateArgv(const std::vector<std::string> &InputArgv) { 301 if (getTargetData().getPointerSize() == 8) { // 64 bit target? 302 PointerTy *Result = new PointerTy[InputArgv.size()+1]; 303 DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n"); 304 305 for (unsigned i = 0; i < InputArgv.size(); ++i) { 306 unsigned Size = InputArgv[i].size()+1; 307 char *Dest = new char[Size]; 308 DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n"); 309 310 copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); 311 Dest[Size-1] = 0; 312 313 // Endian safe: Result[i] = (PointerTy)Dest; 314 StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i), Type::LongTy); 315 } 316 Result[InputArgv.size()] = 0; 317 return Result; 318 319 } else { // 32 bit target? 320 int *Result = new int[InputArgv.size()+1]; 321 DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n"); 322 323 for (unsigned i = 0; i < InputArgv.size(); ++i) { 324 unsigned Size = InputArgv[i].size()+1; 325 char *Dest = new char[Size]; 326 DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n"); 327 328 copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); 329 Dest[Size-1] = 0; 330 331 // Endian safe: Result[i] = (PointerTy)Dest; 332 StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i), Type::IntTy); 333 } 334 Result[InputArgv.size()] = 0; // null terminate it 335 return Result; 336 } 337} 338 339/// EmitGlobals - Emit all of the global variables to memory, storing their 340/// addresses into GlobalAddress. This must make sure to copy the contents of 341/// their initializers into the memory. 342/// 343void ExecutionEngine::emitGlobals() { 344 const TargetData &TD = getTargetData(); 345 346 // Loop over all of the global variables in the program, allocating the memory 347 // to hold them. 348 for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); 349 I != E; ++I) 350 if (!I->isExternal()) { 351 // Get the type of the global... 352 const Type *Ty = I->getType()->getElementType(); 353 354 // Allocate some memory for it! 355 unsigned Size = TD.getTypeSize(Ty); 356 GlobalAddress[I] = new char[Size]; 357 NumInitBytes += Size; 358 359 DEBUG(std::cerr << "Global '" << I->getName() << "' -> " 360 << (void*)GlobalAddress[I] << "\n"); 361 } else { 362 // External variable reference, try to use dlsym to get a pointer to it in 363 // the LLI image. 364 if (void *SymAddr = dlsym(0, I->getName().c_str())) 365 GlobalAddress[I] = SymAddr; 366 else { 367 std::cerr << "Could not resolve external global address: " 368 << I->getName() << "\n"; 369 abort(); 370 } 371 } 372 373 // Now that all of the globals are set up in memory, loop through them all and 374 // initialize their contents. 375 for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); 376 I != E; ++I) 377 if (!I->isExternal()) 378 InitializeMemory(I->getInitializer(), GlobalAddress[I]); 379} 380 381