1 //===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===// 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 // This contains code to emit Constant Expr nodes as LLVM code. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CodeGenFunction.h" 15 #include "CodeGenModule.h" 16 #include "CGObjCRuntime.h" 17 #include "clang/AST/APValue.h" 18 #include "clang/AST/ASTContext.h" 19 #include "clang/AST/StmtVisitor.h" 20 #include "llvm/Constants.h" 21 #include "llvm/Function.h" 22 #include "llvm/GlobalVariable.h" 23 #include "llvm/Support/Compiler.h" 24 #include "llvm/Target/TargetData.h" 25 using namespace clang; 26 using namespace CodeGen; 27 28 namespace { 29 class VISIBILITY_HIDDEN ConstExprEmitter : 30 public StmtVisitor<ConstExprEmitter, llvm::Constant*> { 31 CodeGenModule &CGM; 32 CodeGenFunction *CGF; 33 public: 34 ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf) 35 : CGM(cgm), CGF(cgf) { 36 } 37 38 //===--------------------------------------------------------------------===// 39 // Visitor Methods 40 //===--------------------------------------------------------------------===// 41 42 llvm::Constant *VisitStmt(Stmt *S) { 43 CGM.ErrorUnsupported(S, "constant expression"); 44 QualType T = cast<Expr>(S)->getType(); 45 return llvm::UndefValue::get(CGM.getTypes().ConvertType(T)); 46 } 47 48 llvm::Constant *VisitParenExpr(ParenExpr *PE) { 49 return Visit(PE->getSubExpr()); 50 } 51 52 llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) { 53 std::string S(E->getString()->getStrData(), 54 E->getString()->getByteLength()); 55 llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(S); 56 return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); 57 } 58 59 llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 60 return Visit(E->getInitializer()); 61 } 62 63 llvm::Constant *VisitCastExpr(CastExpr* E) { 64 llvm::Constant *C = Visit(E->getSubExpr()); 65 66 return EmitConversion(C, E->getSubExpr()->getType(), E->getType()); 67 } 68 69 llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { 70 return Visit(DAE->getExpr()); 71 } 72 73 llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) { 74 std::vector<llvm::Constant*> Elts; 75 const llvm::ArrayType *AType = 76 cast<llvm::ArrayType>(ConvertType(ILE->getType())); 77 unsigned NumInitElements = ILE->getNumInits(); 78 // FIXME: Check for wide strings 79 if (NumInitElements > 0 && isa<StringLiteral>(ILE->getInit(0)) && 80 ILE->getType()->getArrayElementTypeNoTypeQual()->isCharType()) 81 return Visit(ILE->getInit(0)); 82 const llvm::Type *ElemTy = AType->getElementType(); 83 unsigned NumElements = AType->getNumElements(); 84 85 // Initialising an array requires us to automatically 86 // initialise any elements that have not been initialised explicitly 87 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 88 89 // Copy initializer elements. 90 unsigned i = 0; 91 bool RewriteType = false; 92 for (; i < NumInitableElts; ++i) { 93 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF); 94 RewriteType |= (C->getType() != ElemTy); 95 Elts.push_back(C); 96 } 97 98 // Initialize remaining array elements. 99 for (; i < NumElements; ++i) 100 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 101 102 if (RewriteType) { 103 // FIXME: Try to avoid packing the array 104 std::vector<const llvm::Type*> Types; 105 for (unsigned i = 0; i < Elts.size(); ++i) 106 Types.push_back(Elts[i]->getType()); 107 const llvm::StructType *SType = llvm::StructType::get(Types, true); 108 return llvm::ConstantStruct::get(SType, Elts); 109 } 110 111 return llvm::ConstantArray::get(AType, Elts); 112 } 113 114 void InsertBitfieldIntoStruct(std::vector<llvm::Constant*>& Elts, 115 FieldDecl* Field, Expr* E) { 116 // Calculate the value to insert 117 llvm::Constant *C = CGM.EmitConstantExpr(E, CGF); 118 llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C); 119 if (!CI) { 120 CGM.ErrorUnsupported(E, "bitfield initialization"); 121 return; 122 } 123 llvm::APInt V = CI->getValue(); 124 125 // Calculate information about the relevant field 126 const llvm::Type* Ty = CI->getType(); 127 const llvm::TargetData &TD = CGM.getTypes().getTargetData(); 128 unsigned size = TD.getTypeStoreSizeInBits(Ty); 129 unsigned fieldOffset = CGM.getTypes().getLLVMFieldNo(Field) * size; 130 CodeGenTypes::BitFieldInfo bitFieldInfo = 131 CGM.getTypes().getBitFieldInfo(Field); 132 fieldOffset += bitFieldInfo.Begin; 133 134 // Find where to start the insertion 135 // FIXME: This is O(n^2) in the number of bit-fields! 136 // FIXME: This won't work if the struct isn't completely packed! 137 unsigned offset = 0, i = 0; 138 while (offset < (fieldOffset & -8)) 139 offset += TD.getTypeStoreSizeInBits(Elts[i++]->getType()); 140 141 // Advance over 0 sized elements (must terminate in bounds since 142 // the bitfield must have a size). 143 while (TD.getTypeStoreSizeInBits(Elts[i]->getType()) == 0) 144 ++i; 145 146 // Promote the size of V if necessary 147 // FIXME: This should never occur, but currently it can because 148 // initializer constants are cast to bool, and because clang is 149 // not enforcing bitfield width limits. 150 if (bitFieldInfo.Size > V.getBitWidth()) 151 V.zext(bitFieldInfo.Size); 152 153 // Insert the bits into the struct 154 // FIXME: This algorthm is only correct on X86! 155 // FIXME: THis algorthm assumes bit-fields only have byte-size elements! 156 unsigned bitsToInsert = bitFieldInfo.Size; 157 unsigned curBits = std::min(8 - (fieldOffset & 7), bitsToInsert); 158 unsigned byte = V.getLoBits(curBits).getZExtValue() << (fieldOffset & 7); 159 do { 160 llvm::Constant* byteC = llvm::ConstantInt::get(llvm::Type::Int8Ty, byte); 161 Elts[i] = llvm::ConstantExpr::getOr(Elts[i], byteC); 162 ++i; 163 V = V.lshr(curBits); 164 bitsToInsert -= curBits; 165 166 if (!bitsToInsert) 167 break; 168 169 curBits = bitsToInsert > 8 ? 8 : bitsToInsert; 170 byte = V.getLoBits(curBits).getZExtValue(); 171 } while (true); 172 } 173 174 llvm::Constant *EmitStructInitialization(InitListExpr *ILE) { 175 const llvm::StructType *SType = 176 cast<llvm::StructType>(ConvertType(ILE->getType())); 177 RecordDecl *RD = ILE->getType()->getAsRecordType()->getDecl(); 178 std::vector<llvm::Constant*> Elts; 179 180 // Initialize the whole structure to zero. 181 for (unsigned i = 0; i < SType->getNumElements(); ++i) { 182 const llvm::Type *FieldTy = SType->getElementType(i); 183 Elts.push_back(llvm::Constant::getNullValue(FieldTy)); 184 } 185 186 // Copy initializer elements. Skip padding fields. 187 unsigned EltNo = 0; // Element no in ILE 188 int FieldNo = 0; // Field no in RecordDecl 189 bool RewriteType = false; 190 for (RecordDecl::field_iterator Field = RD->field_begin(), 191 FieldEnd = RD->field_end(); 192 EltNo < ILE->getNumInits() && Field != FieldEnd; ++Field) { 193 FieldNo++; 194 if (!Field->getIdentifier()) 195 continue; 196 197 if (Field->isBitField()) { 198 InsertBitfieldIntoStruct(Elts, *Field, ILE->getInit(EltNo)); 199 } else { 200 unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(*Field); 201 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), CGF); 202 RewriteType |= (C->getType() != Elts[FieldNo]->getType()); 203 Elts[FieldNo] = C; 204 } 205 EltNo++; 206 } 207 208 if (RewriteType) { 209 // FIXME: Make this work for non-packed structs 210 assert(SType->isPacked() && "Cannot recreate unpacked structs"); 211 std::vector<const llvm::Type*> Types; 212 for (unsigned i = 0; i < Elts.size(); ++i) 213 Types.push_back(Elts[i]->getType()); 214 SType = llvm::StructType::get(Types, true); 215 } 216 217 return llvm::ConstantStruct::get(SType, Elts); 218 } 219 220 llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) { 221 RecordDecl *RD = ILE->getType()->getAsRecordType()->getDecl(); 222 const llvm::Type *Ty = ConvertType(ILE->getType()); 223 224 // Find the field decl we're initializing, if any 225 int FieldNo = 0; // Field no in RecordDecl 226 FieldDecl* curField = 0; 227 for (RecordDecl::field_iterator Field = RD->field_begin(), 228 FieldEnd = RD->field_end(); 229 Field != FieldEnd; ++Field) { 230 curField = *Field; 231 FieldNo++; 232 if (curField->getIdentifier()) 233 break; 234 } 235 236 if (!curField || !curField->getIdentifier() || ILE->getNumInits() == 0) 237 return llvm::Constant::getNullValue(Ty); 238 239 if (curField->isBitField()) { 240 // Create a dummy struct for bit-field insertion 241 unsigned NumElts = CGM.getTargetData().getABITypeSize(Ty) / 8; 242 llvm::Constant* NV = llvm::Constant::getNullValue(llvm::Type::Int8Ty); 243 std::vector<llvm::Constant*> Elts(NumElts, NV); 244 245 InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(0)); 246 const llvm::ArrayType *RetTy = 247 llvm::ArrayType::get(NV->getType(), NumElts); 248 return llvm::ConstantArray::get(RetTy, Elts); 249 } 250 251 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(0), CGF); 252 253 // Build a struct with the union sub-element as the first member, 254 // and padded to the appropriate size 255 std::vector<llvm::Constant*> Elts; 256 std::vector<const llvm::Type*> Types; 257 Elts.push_back(C); 258 Types.push_back(C->getType()); 259 unsigned CurSize = CGM.getTargetData().getTypeStoreSize(C->getType()); 260 unsigned TotalSize = CGM.getTargetData().getTypeStoreSize(Ty); 261 while (CurSize < TotalSize) { 262 Elts.push_back(llvm::Constant::getNullValue(llvm::Type::Int8Ty)); 263 Types.push_back(llvm::Type::Int8Ty); 264 CurSize++; 265 } 266 267 // This always generates a packed struct 268 // FIXME: Try to generate an unpacked struct when we can 269 llvm::StructType* STy = llvm::StructType::get(Types, true); 270 return llvm::ConstantStruct::get(STy, Elts); 271 } 272 273 llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) { 274 const llvm::VectorType *VType = 275 cast<llvm::VectorType>(ConvertType(ILE->getType())); 276 const llvm::Type *ElemTy = VType->getElementType(); 277 std::vector<llvm::Constant*> Elts; 278 unsigned NumElements = VType->getNumElements(); 279 unsigned NumInitElements = ILE->getNumInits(); 280 281 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 282 283 // Copy initializer elements. 284 unsigned i = 0; 285 for (; i < NumInitableElts; ++i) { 286 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF); 287 Elts.push_back(C); 288 } 289 290 for (; i < NumElements; ++i) 291 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 292 293 return llvm::ConstantVector::get(VType, Elts); 294 } 295 296 llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { 297 if (ILE->getType()->isScalarType()) { 298 // We have a scalar in braces. Just use the first element. 299 if (ILE->getNumInits() > 0) 300 return CGM.EmitConstantExpr(ILE->getInit(0), CGF); 301 302 const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType()); 303 return llvm::Constant::getNullValue(RetTy); 304 } 305 306 // FIXME: We don't codegen or sema designators yet. 307 if (ILE->hadDesignators()) { 308 CGM.ErrorUnsupported(ILE, "initializer list with designators"); 309 return llvm::UndefValue::get(ConvertType(ILE->getType())); 310 } 311 312 if (ILE->getType()->isArrayType()) 313 return EmitArrayInitialization(ILE); 314 315 if (ILE->getType()->isStructureType()) 316 return EmitStructInitialization(ILE); 317 318 if (ILE->getType()->isUnionType()) 319 return EmitUnionInitialization(ILE); 320 321 if (ILE->getType()->isVectorType()) 322 return EmitVectorInitialization(ILE); 323 324 assert(0 && "Unable to handle InitListExpr"); 325 // Get rid of control reaches end of void function warning. 326 // Not reached. 327 return 0; 328 } 329 330 llvm::Constant *VisitImplicitCastExpr(ImplicitCastExpr *ICExpr) { 331 Expr* SExpr = ICExpr->getSubExpr(); 332 QualType SType = SExpr->getType(); 333 llvm::Constant *C; // the intermediate expression 334 QualType T; // the type of the intermediate expression 335 if (SType->isArrayType()) { 336 // Arrays decay to a pointer to the first element 337 // VLAs would require special handling, but they can't occur here 338 C = EmitLValue(SExpr); 339 llvm::Constant *Idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 340 llvm::Constant *Ops[] = {Idx0, Idx0}; 341 C = llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); 342 T = CGM.getContext().getArrayDecayedType(SType); 343 } else if (SType->isFunctionType()) { 344 // Function types decay to a pointer to the function 345 C = EmitLValue(SExpr); 346 T = CGM.getContext().getPointerType(SType); 347 } else { 348 C = Visit(SExpr); 349 T = SType; 350 } 351 352 // Perform the conversion; note that an implicit cast can both promote 353 // and convert an array/function 354 return EmitConversion(C, T, ICExpr->getType()); 355 } 356 357 llvm::Constant *VisitStringLiteral(StringLiteral *E) { 358 assert(!E->getType()->isPointerType() && "Strings are always arrays"); 359 360 // Otherwise this must be a string initializing an array in a static 361 // initializer. Don't emit it as the address of the string, emit the string 362 // data itself as an inline array. 363 return llvm::ConstantArray::get(CGM.GetStringForStringLiteral(E), false); 364 } 365 366 llvm::Constant *VisitAddrLabelExpr(const AddrLabelExpr *E) { 367 assert(CGF && "Invalid address of label expression outside function."); 368 llvm::Constant *C = 369 llvm::ConstantInt::get(llvm::Type::Int32Ty, 370 CGF->GetIDForAddrOfLabel(E->getLabel())); 371 return llvm::ConstantExpr::getIntToPtr(C, ConvertType(E->getType())); 372 } 373 374 llvm::Constant *VisitUnaryAddrOf(const UnaryOperator *E) { 375 return EmitLValue(E->getSubExpr()); 376 } 377 llvm::Constant *VisitUnaryOffsetOf(const UnaryOperator *E) { 378 int64_t Val = E->evaluateOffsetOf(CGM.getContext()); 379 380 assert(E->getType()->isIntegerType() && "Result type must be an integer!"); 381 382 uint32_t ResultWidth = 383 static_cast<uint32_t>(CGM.getContext().getTypeSize(E->getType())); 384 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 385 } 386 387 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) { 388 return Visit(E->getSubExpr()); 389 } 390 391 // Binary operators 392 393 llvm::Constant *VisitCallExpr(const CallExpr *E) { 394 Expr::EvalResult Result; 395 if (E->Evaluate(Result, CGM.getContext())) { 396 if (Result.Val.isInt()) 397 return llvm::ConstantInt::get(Result.Val.getInt()); 398 if (Result.Val.isFloat()) 399 return llvm::ConstantFP::get(Result.Val.getFloat()); 400 } 401 402 // Handle __builtin___CFStringMakeConstantString. 403 if (E->isBuiltinCall() ==Builtin::BI__builtin___CFStringMakeConstantString){ 404 const Expr *Arg = E->getArg(0)->IgnoreParenCasts(); 405 406 const StringLiteral *Literal = cast<StringLiteral>(Arg); 407 std::string S(Literal->getStrData(), Literal->getByteLength()); 408 return CGM.GetAddrOfConstantCFString(S); 409 } 410 411 CGM.ErrorUnsupported(E, "constant call expression"); 412 return llvm::Constant::getNullValue(ConvertType(E->getType())); 413 } 414 415 // Utility methods 416 const llvm::Type *ConvertType(QualType T) { 417 return CGM.getTypes().ConvertType(T); 418 } 419 420 llvm::Constant *EmitConversionToBool(llvm::Constant *Src, QualType SrcType) { 421 assert(SrcType->isCanonical() && "EmitConversion strips typedefs"); 422 423 if (SrcType->isRealFloatingType()) { 424 // Compare against 0.0 for fp scalars. 425 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 426 return llvm::ConstantExpr::getFCmp(llvm::FCmpInst::FCMP_UNE, Src, Zero); 427 } 428 429 assert((SrcType->isIntegerType() || SrcType->isPointerType()) && 430 "Unknown scalar type to convert"); 431 432 // Compare against an integer or pointer null. 433 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 434 return llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_NE, Src, Zero); 435 } 436 437 llvm::Constant *EmitConversion(llvm::Constant *Src, QualType SrcType, 438 QualType DstType) { 439 SrcType = CGM.getContext().getCanonicalType(SrcType); 440 DstType = CGM.getContext().getCanonicalType(DstType); 441 if (SrcType == DstType) return Src; 442 443 // Handle conversions to bool first, they are special: comparisons against 0. 444 if (DstType->isBooleanType()) 445 return EmitConversionToBool(Src, SrcType); 446 447 const llvm::Type *DstTy = ConvertType(DstType); 448 449 // Ignore conversions like int -> uint. 450 if (Src->getType() == DstTy) 451 return Src; 452 453 // Handle pointer conversions next: pointers can only be converted to/from 454 // other pointers and integers. 455 if (isa<llvm::PointerType>(DstTy)) { 456 // The source value may be an integer, or a pointer. 457 if (isa<llvm::PointerType>(Src->getType())) 458 return llvm::ConstantExpr::getBitCast(Src, DstTy); 459 assert(SrcType->isIntegerType() &&"Not ptr->ptr or int->ptr conversion?"); 460 return llvm::ConstantExpr::getIntToPtr(Src, DstTy); 461 } 462 463 if (isa<llvm::PointerType>(Src->getType())) { 464 // Must be an ptr to int cast. 465 assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?"); 466 return llvm::ConstantExpr::getPtrToInt(Src, DstTy); 467 } 468 469 // A scalar source can be splatted to a vector of the same element type 470 if (isa<llvm::VectorType>(DstTy) && !isa<VectorType>(SrcType)) { 471 assert((cast<llvm::VectorType>(DstTy)->getElementType() 472 == Src->getType()) && 473 "Vector element type must match scalar type to splat."); 474 unsigned NumElements = DstType->getAsVectorType()->getNumElements(); 475 llvm::SmallVector<llvm::Constant*, 16> Elements; 476 for (unsigned i = 0; i < NumElements; i++) 477 Elements.push_back(Src); 478 479 return llvm::ConstantVector::get(&Elements[0], NumElements); 480 } 481 482 if (isa<llvm::VectorType>(Src->getType()) || 483 isa<llvm::VectorType>(DstTy)) { 484 return llvm::ConstantExpr::getBitCast(Src, DstTy); 485 } 486 487 // Finally, we have the arithmetic types: real int/float. 488 if (isa<llvm::IntegerType>(Src->getType())) { 489 bool InputSigned = SrcType->isSignedIntegerType(); 490 if (isa<llvm::IntegerType>(DstTy)) 491 return llvm::ConstantExpr::getIntegerCast(Src, DstTy, InputSigned); 492 else if (InputSigned) 493 return llvm::ConstantExpr::getSIToFP(Src, DstTy); 494 else 495 return llvm::ConstantExpr::getUIToFP(Src, DstTy); 496 } 497 498 assert(Src->getType()->isFloatingPoint() && "Unknown real conversion"); 499 if (isa<llvm::IntegerType>(DstTy)) { 500 if (DstType->isSignedIntegerType()) 501 return llvm::ConstantExpr::getFPToSI(Src, DstTy); 502 else 503 return llvm::ConstantExpr::getFPToUI(Src, DstTy); 504 } 505 506 assert(DstTy->isFloatingPoint() && "Unknown real conversion"); 507 if (DstTy->getTypeID() < Src->getType()->getTypeID()) 508 return llvm::ConstantExpr::getFPTrunc(Src, DstTy); 509 else 510 return llvm::ConstantExpr::getFPExtend(Src, DstTy); 511 } 512 513 llvm::Constant *EmitSizeAlignOf(QualType TypeToSize, 514 QualType RetType, bool isSizeOf) { 515 std::pair<uint64_t, unsigned> Info = 516 CGM.getContext().getTypeInfo(TypeToSize); 517 518 uint64_t Val = isSizeOf ? Info.first : Info.second; 519 Val /= 8; // Return size in bytes, not bits. 520 521 assert(RetType->isIntegerType() && "Result type must be an integer!"); 522 523 uint32_t ResultWidth = 524 static_cast<uint32_t>(CGM.getContext().getTypeSize(RetType)); 525 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 526 } 527 528 public: 529 llvm::Constant *EmitLValue(Expr *E) { 530 switch (E->getStmtClass()) { 531 default: break; 532 case Expr::ParenExprClass: 533 // Elide parenthesis 534 return EmitLValue(cast<ParenExpr>(E)->getSubExpr()); 535 case Expr::CompoundLiteralExprClass: { 536 // Note that due to the nature of compound literals, this is guaranteed 537 // to be the only use of the variable, so we just generate it here. 538 CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E); 539 llvm::Constant* C = Visit(CLE->getInitializer()); 540 C = new llvm::GlobalVariable(C->getType(),E->getType().isConstQualified(), 541 llvm::GlobalValue::InternalLinkage, 542 C, ".compoundliteral", &CGM.getModule()); 543 return C; 544 } 545 case Expr::DeclRefExprClass: { 546 NamedDecl *Decl = cast<DeclRefExpr>(E)->getDecl(); 547 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl)) 548 return CGM.GetAddrOfFunction(FD); 549 if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) { 550 if (VD->isFileVarDecl()) 551 return CGM.GetAddrOfGlobalVar(VD); 552 else if (VD->isBlockVarDecl()) { 553 assert(CGF && "Can't access static local vars without CGF"); 554 return CGF->GetAddrOfStaticLocalVar(VD); 555 } 556 } 557 break; 558 } 559 case Expr::MemberExprClass: { 560 MemberExpr* ME = cast<MemberExpr>(E); 561 llvm::Constant *Base; 562 if (ME->isArrow()) 563 Base = Visit(ME->getBase()); 564 else 565 Base = EmitLValue(ME->getBase()); 566 567 unsigned FieldNumber = CGM.getTypes().getLLVMFieldNo(ME->getMemberDecl()); 568 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 569 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 570 FieldNumber); 571 llvm::Value *Ops[] = {Zero, Idx}; 572 return llvm::ConstantExpr::getGetElementPtr(Base, Ops, 2); 573 } 574 case Expr::ArraySubscriptExprClass: { 575 ArraySubscriptExpr* ASExpr = cast<ArraySubscriptExpr>(E); 576 llvm::Constant *Base = Visit(ASExpr->getBase()); 577 llvm::Constant *Index = Visit(ASExpr->getIdx()); 578 assert(!ASExpr->getBase()->getType()->isVectorType() && 579 "Taking the address of a vector component is illegal!"); 580 return llvm::ConstantExpr::getGetElementPtr(Base, &Index, 1); 581 } 582 case Expr::StringLiteralClass: 583 return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E)); 584 case Expr::ObjCStringLiteralClass: { 585 ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E); 586 std::string S(SL->getString()->getStrData(), 587 SL->getString()->getByteLength()); 588 llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(S); 589 return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); 590 } 591 case Expr::UnaryOperatorClass: { 592 UnaryOperator *Exp = cast<UnaryOperator>(E); 593 switch (Exp->getOpcode()) { 594 default: break; 595 case UnaryOperator::Extension: 596 // Extension is just a wrapper for expressions 597 return EmitLValue(Exp->getSubExpr()); 598 case UnaryOperator::Real: 599 case UnaryOperator::Imag: { 600 // The address of __real or __imag is just a GEP off the address 601 // of the internal expression 602 llvm::Constant* C = EmitLValue(Exp->getSubExpr()); 603 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 604 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 605 Exp->getOpcode() == UnaryOperator::Imag); 606 llvm::Value *Ops[] = {Zero, Idx}; 607 return llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); 608 } 609 case UnaryOperator::Deref: 610 // The address of a deref is just the value of the expression 611 return Visit(Exp->getSubExpr()); 612 } 613 break; 614 } 615 616 case Expr::PredefinedExprClass: { 617 // __func__/__FUNCTION__ -> "". __PRETTY_FUNCTION__ -> "top level". 618 std::string Str; 619 if (cast<PredefinedExpr>(E)->getIdentType() == 620 PredefinedExpr::PrettyFunction) 621 Str = "top level"; 622 623 return CGM.GetAddrOfConstantCString(Str, ".tmp"); 624 } 625 } 626 CGM.ErrorUnsupported(E, "constant l-value expression"); 627 llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType())); 628 return llvm::UndefValue::get(Ty); 629 } 630 }; 631 632 } // end anonymous namespace. 633 634 llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, 635 CodeGenFunction *CGF) { 636 QualType type = Context.getCanonicalType(E->getType()); 637 638 Expr::EvalResult Result; 639 640 if (E->Evaluate(Result, Context)) { 641 assert(!Result.HasSideEffects && 642 "Constant expr should not have any side effects!"); 643 switch (Result.Val.getKind()) { 644 default: assert(0 && "unhandled value kind!"); 645 case APValue::LValue: { 646 llvm::Constant *Offset = 647 llvm::ConstantInt::get(llvm::Type::Int64Ty, 648 Result.Val.getLValueOffset()); 649 650 if (const Expr *LVBase = Result.Val.getLValueBase()) { 651 llvm::Constant *C = 652 ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase)); 653 654 const llvm::Type *Type = 655 llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 656 const llvm::Type *DestType = getTypes().ConvertTypeForMem(E->getType()); 657 658 // FIXME: It's a little ugly that we need to cast to a pointer, 659 // apply the GEP and then cast back. 660 C = llvm::ConstantExpr::getBitCast(C, Type); 661 C = llvm::ConstantExpr::getGetElementPtr(C, &Offset, 1); 662 663 return llvm::ConstantExpr::getBitCast(C, DestType); 664 } 665 666 return llvm::ConstantExpr::getIntToPtr(Offset, 667 getTypes().ConvertType(type)); 668 } 669 case APValue::Int: { 670 llvm::Constant *C = llvm::ConstantInt::get(Result.Val.getInt()); 671 672 if (C->getType() == llvm::Type::Int1Ty) { 673 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 674 C = llvm::ConstantExpr::getZExt(C, BoolTy); 675 } 676 return C; 677 } 678 case APValue::Float: 679 return llvm::ConstantFP::get(Result.Val.getFloat()); 680 case APValue::ComplexFloat: { 681 llvm::Constant *Complex[2]; 682 683 Complex[0] = llvm::ConstantFP::get(Result.Val.getComplexFloatReal()); 684 Complex[1] = llvm::ConstantFP::get(Result.Val.getComplexFloatImag()); 685 686 return llvm::ConstantStruct::get(Complex, 2); 687 } 688 } 689 } 690 691 llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E)); 692 if (C->getType() == llvm::Type::Int1Ty) { 693 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 694 C = llvm::ConstantExpr::getZExt(C, BoolTy); 695 } 696 return C; 697 } 698