CGExprConstant.cpp revision 704e4907ee0116e53f270d778c955da9f01fc2d8
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" 25using namespace clang; 26using namespace CodeGen; 27 28namespace { 29class VISIBILITY_HIDDEN ConstExprEmitter : 30 public StmtVisitor<ConstExprEmitter, llvm::Constant*> { 31 CodeGenModule &CGM; 32 CodeGenFunction *CGF; 33public: 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 while (EltNo < ILE->getNumInits() && FieldNo < RD->getNumMembers()) { 191 FieldDecl* curField = RD->getMember(FieldNo); 192 FieldNo++; 193 if (!curField->getIdentifier()) 194 continue; 195 196 if (curField->isBitField()) { 197 InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(EltNo)); 198 } else { 199 unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(curField); 200 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), CGF); 201 RewriteType |= (C->getType() != Elts[FieldNo]->getType()); 202 Elts[FieldNo] = C; 203 } 204 EltNo++; 205 } 206 207 if (RewriteType) { 208 // FIXME: Make this work for non-packed structs 209 assert(SType->isPacked() && "Cannot recreate unpacked structs"); 210 std::vector<const llvm::Type*> Types; 211 for (unsigned i = 0; i < Elts.size(); ++i) 212 Types.push_back(Elts[i]->getType()); 213 SType = llvm::StructType::get(Types, true); 214 } 215 216 return llvm::ConstantStruct::get(SType, Elts); 217 } 218 219 llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) { 220 RecordDecl *RD = ILE->getType()->getAsRecordType()->getDecl(); 221 const llvm::Type *Ty = ConvertType(ILE->getType()); 222 223 // Find the field decl we're initializing, if any 224 int FieldNo = 0; // Field no in RecordDecl 225 FieldDecl* curField = 0; 226 while (FieldNo < RD->getNumMembers()) { 227 curField = RD->getMember(FieldNo); 228 FieldNo++; 229 if (curField->getIdentifier()) 230 break; 231 } 232 233 if (!curField || !curField->getIdentifier() || ILE->getNumInits() == 0) 234 return llvm::Constant::getNullValue(Ty); 235 236 if (curField->isBitField()) { 237 // Create a dummy struct for bit-field insertion 238 unsigned NumElts = CGM.getTargetData().getABITypeSize(Ty) / 8; 239 llvm::Constant* NV = llvm::Constant::getNullValue(llvm::Type::Int8Ty); 240 std::vector<llvm::Constant*> Elts(NumElts, NV); 241 242 InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(0)); 243 const llvm::ArrayType *RetTy = 244 llvm::ArrayType::get(NV->getType(), NumElts); 245 return llvm::ConstantArray::get(RetTy, Elts); 246 } 247 248 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(0), CGF); 249 250 // Build a struct with the union sub-element as the first member, 251 // and padded to the appropriate size 252 std::vector<llvm::Constant*> Elts; 253 std::vector<const llvm::Type*> Types; 254 Elts.push_back(C); 255 Types.push_back(C->getType()); 256 unsigned CurSize = CGM.getTargetData().getTypeStoreSize(C->getType()); 257 unsigned TotalSize = CGM.getTargetData().getTypeStoreSize(Ty); 258 while (CurSize < TotalSize) { 259 Elts.push_back(llvm::Constant::getNullValue(llvm::Type::Int8Ty)); 260 Types.push_back(llvm::Type::Int8Ty); 261 CurSize++; 262 } 263 264 // This always generates a packed struct 265 // FIXME: Try to generate an unpacked struct when we can 266 llvm::StructType* STy = llvm::StructType::get(Types, true); 267 return llvm::ConstantStruct::get(STy, Elts); 268 } 269 270 llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) { 271 const llvm::VectorType *VType = 272 cast<llvm::VectorType>(ConvertType(ILE->getType())); 273 const llvm::Type *ElemTy = VType->getElementType(); 274 std::vector<llvm::Constant*> Elts; 275 unsigned NumElements = VType->getNumElements(); 276 unsigned NumInitElements = ILE->getNumInits(); 277 278 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 279 280 // Copy initializer elements. 281 unsigned i = 0; 282 for (; i < NumInitableElts; ++i) { 283 llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF); 284 Elts.push_back(C); 285 } 286 287 for (; i < NumElements; ++i) 288 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 289 290 return llvm::ConstantVector::get(VType, Elts); 291 } 292 293 llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { 294 if (ILE->getType()->isScalarType()) { 295 // We have a scalar in braces. Just use the first element. 296 if (ILE->getNumInits() > 0) 297 return CGM.EmitConstantExpr(ILE->getInit(0), CGF); 298 299 const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType()); 300 return llvm::Constant::getNullValue(RetTy); 301 } 302 303 // FIXME: We don't codegen or sema designators yet. 304 if (ILE->hadDesignators()) { 305 CGM.ErrorUnsupported(ILE, "initializer list with designators"); 306 return llvm::UndefValue::get(ConvertType(ILE->getType())); 307 } 308 309 if (ILE->getType()->isArrayType()) 310 return EmitArrayInitialization(ILE); 311 312 if (ILE->getType()->isStructureType()) 313 return EmitStructInitialization(ILE); 314 315 if (ILE->getType()->isUnionType()) 316 return EmitUnionInitialization(ILE); 317 318 if (ILE->getType()->isVectorType()) 319 return EmitVectorInitialization(ILE); 320 321 assert(0 && "Unable to handle InitListExpr"); 322 // Get rid of control reaches end of void function warning. 323 // Not reached. 324 return 0; 325 } 326 327 llvm::Constant *VisitImplicitCastExpr(ImplicitCastExpr *ICExpr) { 328 Expr* SExpr = ICExpr->getSubExpr(); 329 QualType SType = SExpr->getType(); 330 llvm::Constant *C; // the intermediate expression 331 QualType T; // the type of the intermediate expression 332 if (SType->isArrayType()) { 333 // Arrays decay to a pointer to the first element 334 // VLAs would require special handling, but they can't occur here 335 C = EmitLValue(SExpr); 336 llvm::Constant *Idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 337 llvm::Constant *Ops[] = {Idx0, Idx0}; 338 C = llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); 339 T = CGM.getContext().getArrayDecayedType(SType); 340 } else if (SType->isFunctionType()) { 341 // Function types decay to a pointer to the function 342 C = EmitLValue(SExpr); 343 T = CGM.getContext().getPointerType(SType); 344 } else { 345 C = Visit(SExpr); 346 T = SType; 347 } 348 349 // Perform the conversion; note that an implicit cast can both promote 350 // and convert an array/function 351 return EmitConversion(C, T, ICExpr->getType()); 352 } 353 354 llvm::Constant *VisitStringLiteral(StringLiteral *E) { 355 assert(!E->getType()->isPointerType() && "Strings are always arrays"); 356 357 // Otherwise this must be a string initializing an array in a static 358 // initializer. Don't emit it as the address of the string, emit the string 359 // data itself as an inline array. 360 return llvm::ConstantArray::get(CGM.GetStringForStringLiteral(E), false); 361 } 362 363 llvm::Constant *VisitAddrLabelExpr(const AddrLabelExpr *E) { 364 assert(CGF && "Invalid address of label expression outside function."); 365 llvm::Constant *C = 366 llvm::ConstantInt::get(llvm::Type::Int32Ty, 367 CGF->GetIDForAddrOfLabel(E->getLabel())); 368 return llvm::ConstantExpr::getIntToPtr(C, ConvertType(E->getType())); 369 } 370 371 llvm::Constant *VisitUnaryAddrOf(const UnaryOperator *E) { 372 return EmitLValue(E->getSubExpr()); 373 } 374 llvm::Constant *VisitUnaryOffsetOf(const UnaryOperator *E) { 375 int64_t Val = E->evaluateOffsetOf(CGM.getContext()); 376 377 assert(E->getType()->isIntegerType() && "Result type must be an integer!"); 378 379 uint32_t ResultWidth = 380 static_cast<uint32_t>(CGM.getContext().getTypeSize(E->getType())); 381 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 382 } 383 384 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) { 385 return Visit(E->getSubExpr()); 386 } 387 388 // Binary operators 389 390 llvm::Constant *VisitCallExpr(const CallExpr *E) { 391 APValue Result; 392 if (E->Evaluate(Result, CGM.getContext())) { 393 if (Result.isInt()) 394 return llvm::ConstantInt::get(Result.getInt()); 395 if (Result.isFloat()) 396 return llvm::ConstantFP::get(Result.getFloat()); 397 } 398 399 // Handle __builtin___CFStringMakeConstantString. 400 if (E->isBuiltinCall() ==Builtin::BI__builtin___CFStringMakeConstantString){ 401 const Expr *Arg = E->getArg(0)->IgnoreParenCasts(); 402 403 const StringLiteral *Literal = cast<StringLiteral>(Arg); 404 std::string S(Literal->getStrData(), Literal->getByteLength()); 405 return CGM.GetAddrOfConstantCFString(S); 406 } 407 408 CGM.ErrorUnsupported(E, "constant call expression"); 409 return llvm::Constant::getNullValue(ConvertType(E->getType())); 410 } 411 412 // Utility methods 413 const llvm::Type *ConvertType(QualType T) { 414 return CGM.getTypes().ConvertType(T); 415 } 416 417 llvm::Constant *EmitConversionToBool(llvm::Constant *Src, QualType SrcType) { 418 assert(SrcType->isCanonical() && "EmitConversion strips typedefs"); 419 420 if (SrcType->isRealFloatingType()) { 421 // Compare against 0.0 for fp scalars. 422 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 423 return llvm::ConstantExpr::getFCmp(llvm::FCmpInst::FCMP_UNE, Src, Zero); 424 } 425 426 assert((SrcType->isIntegerType() || SrcType->isPointerType()) && 427 "Unknown scalar type to convert"); 428 429 // Compare against an integer or pointer null. 430 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 431 return llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_NE, Src, Zero); 432 } 433 434 llvm::Constant *EmitConversion(llvm::Constant *Src, QualType SrcType, 435 QualType DstType) { 436 SrcType = CGM.getContext().getCanonicalType(SrcType); 437 DstType = CGM.getContext().getCanonicalType(DstType); 438 if (SrcType == DstType) return Src; 439 440 // Handle conversions to bool first, they are special: comparisons against 0. 441 if (DstType->isBooleanType()) 442 return EmitConversionToBool(Src, SrcType); 443 444 const llvm::Type *DstTy = ConvertType(DstType); 445 446 // Ignore conversions like int -> uint. 447 if (Src->getType() == DstTy) 448 return Src; 449 450 // Handle pointer conversions next: pointers can only be converted to/from 451 // other pointers and integers. 452 if (isa<llvm::PointerType>(DstTy)) { 453 // The source value may be an integer, or a pointer. 454 if (isa<llvm::PointerType>(Src->getType())) 455 return llvm::ConstantExpr::getBitCast(Src, DstTy); 456 assert(SrcType->isIntegerType() &&"Not ptr->ptr or int->ptr conversion?"); 457 return llvm::ConstantExpr::getIntToPtr(Src, DstTy); 458 } 459 460 if (isa<llvm::PointerType>(Src->getType())) { 461 // Must be an ptr to int cast. 462 assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?"); 463 return llvm::ConstantExpr::getPtrToInt(Src, DstTy); 464 } 465 466 // A scalar source can be splatted to a vector of the same element type 467 if (isa<llvm::VectorType>(DstTy) && !isa<VectorType>(SrcType)) { 468 assert((cast<llvm::VectorType>(DstTy)->getElementType() 469 == Src->getType()) && 470 "Vector element type must match scalar type to splat."); 471 unsigned NumElements = DstType->getAsVectorType()->getNumElements(); 472 llvm::SmallVector<llvm::Constant*, 16> Elements; 473 for (unsigned i = 0; i < NumElements; i++) 474 Elements.push_back(Src); 475 476 return llvm::ConstantVector::get(&Elements[0], NumElements); 477 } 478 479 if (isa<llvm::VectorType>(Src->getType()) || 480 isa<llvm::VectorType>(DstTy)) { 481 return llvm::ConstantExpr::getBitCast(Src, DstTy); 482 } 483 484 // Finally, we have the arithmetic types: real int/float. 485 if (isa<llvm::IntegerType>(Src->getType())) { 486 bool InputSigned = SrcType->isSignedIntegerType(); 487 if (isa<llvm::IntegerType>(DstTy)) 488 return llvm::ConstantExpr::getIntegerCast(Src, DstTy, InputSigned); 489 else if (InputSigned) 490 return llvm::ConstantExpr::getSIToFP(Src, DstTy); 491 else 492 return llvm::ConstantExpr::getUIToFP(Src, DstTy); 493 } 494 495 assert(Src->getType()->isFloatingPoint() && "Unknown real conversion"); 496 if (isa<llvm::IntegerType>(DstTy)) { 497 if (DstType->isSignedIntegerType()) 498 return llvm::ConstantExpr::getFPToSI(Src, DstTy); 499 else 500 return llvm::ConstantExpr::getFPToUI(Src, DstTy); 501 } 502 503 assert(DstTy->isFloatingPoint() && "Unknown real conversion"); 504 if (DstTy->getTypeID() < Src->getType()->getTypeID()) 505 return llvm::ConstantExpr::getFPTrunc(Src, DstTy); 506 else 507 return llvm::ConstantExpr::getFPExtend(Src, DstTy); 508 } 509 510 llvm::Constant *EmitSizeAlignOf(QualType TypeToSize, 511 QualType RetType, bool isSizeOf) { 512 std::pair<uint64_t, unsigned> Info = 513 CGM.getContext().getTypeInfo(TypeToSize); 514 515 uint64_t Val = isSizeOf ? Info.first : Info.second; 516 Val /= 8; // Return size in bytes, not bits. 517 518 assert(RetType->isIntegerType() && "Result type must be an integer!"); 519 520 uint32_t ResultWidth = 521 static_cast<uint32_t>(CGM.getContext().getTypeSize(RetType)); 522 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 523 } 524 525public: 526 llvm::Constant *EmitLValue(Expr *E) { 527 switch (E->getStmtClass()) { 528 default: break; 529 case Expr::ParenExprClass: 530 // Elide parenthesis 531 return EmitLValue(cast<ParenExpr>(E)->getSubExpr()); 532 case Expr::CompoundLiteralExprClass: { 533 // Note that due to the nature of compound literals, this is guaranteed 534 // to be the only use of the variable, so we just generate it here. 535 CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E); 536 llvm::Constant* C = Visit(CLE->getInitializer()); 537 C = new llvm::GlobalVariable(C->getType(),E->getType().isConstQualified(), 538 llvm::GlobalValue::InternalLinkage, 539 C, ".compoundliteral", &CGM.getModule()); 540 return C; 541 } 542 case Expr::DeclRefExprClass: { 543 NamedDecl *Decl = cast<DeclRefExpr>(E)->getDecl(); 544 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl)) 545 return CGM.GetAddrOfFunction(FD); 546 if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) { 547 if (VD->isFileVarDecl()) 548 return CGM.GetAddrOfGlobalVar(VD); 549 else if (VD->isBlockVarDecl()) { 550 assert(CGF && "Can't access static local vars without CGF"); 551 return CGF->GetAddrOfStaticLocalVar(VD); 552 } 553 } 554 break; 555 } 556 case Expr::MemberExprClass: { 557 MemberExpr* ME = cast<MemberExpr>(E); 558 llvm::Constant *Base; 559 if (ME->isArrow()) 560 Base = Visit(ME->getBase()); 561 else 562 Base = EmitLValue(ME->getBase()); 563 564 unsigned FieldNumber = CGM.getTypes().getLLVMFieldNo(ME->getMemberDecl()); 565 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 566 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 567 FieldNumber); 568 llvm::Value *Ops[] = {Zero, Idx}; 569 return llvm::ConstantExpr::getGetElementPtr(Base, Ops, 2); 570 } 571 case Expr::ArraySubscriptExprClass: { 572 ArraySubscriptExpr* ASExpr = cast<ArraySubscriptExpr>(E); 573 llvm::Constant *Base = Visit(ASExpr->getBase()); 574 llvm::Constant *Index = Visit(ASExpr->getIdx()); 575 assert(!ASExpr->getBase()->getType()->isVectorType() && 576 "Taking the address of a vector component is illegal!"); 577 return llvm::ConstantExpr::getGetElementPtr(Base, &Index, 1); 578 } 579 case Expr::StringLiteralClass: 580 return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E)); 581 case Expr::ObjCStringLiteralClass: { 582 ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E); 583 std::string S(SL->getString()->getStrData(), 584 SL->getString()->getByteLength()); 585 llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(S); 586 return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); 587 } 588 case Expr::UnaryOperatorClass: { 589 UnaryOperator *Exp = cast<UnaryOperator>(E); 590 switch (Exp->getOpcode()) { 591 default: break; 592 case UnaryOperator::Extension: 593 // Extension is just a wrapper for expressions 594 return EmitLValue(Exp->getSubExpr()); 595 case UnaryOperator::Real: 596 case UnaryOperator::Imag: { 597 // The address of __real or __imag is just a GEP off the address 598 // of the internal expression 599 llvm::Constant* C = EmitLValue(Exp->getSubExpr()); 600 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 601 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 602 Exp->getOpcode() == UnaryOperator::Imag); 603 llvm::Value *Ops[] = {Zero, Idx}; 604 return llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); 605 } 606 case UnaryOperator::Deref: 607 // The address of a deref is just the value of the expression 608 return Visit(Exp->getSubExpr()); 609 } 610 break; 611 } 612 } 613 CGM.ErrorUnsupported(E, "constant l-value expression"); 614 llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType())); 615 return llvm::UndefValue::get(Ty); 616 } 617}; 618 619} // end anonymous namespace. 620 621llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, 622 CodeGenFunction *CGF) { 623 QualType type = Context.getCanonicalType(E->getType()); 624 625 APValue V; 626 if (E->Evaluate(V, Context)) { 627 // FIXME: Assert that the value doesn't have any side effects. 628 switch (V.getKind()) { 629 default: assert(0 && "unhandled value kind!"); 630 case APValue::LValue: { 631 llvm::Constant *Offset = llvm::ConstantInt::get(llvm::Type::Int64Ty, 632 V.getLValueOffset()); 633 634 if (const Expr *LVBase = V.getLValueBase()) { 635 llvm::Constant *C = 636 ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase)); 637 638 const llvm::Type *Type = 639 llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 640 const llvm::Type *DestType = getTypes().ConvertTypeForMem(E->getType()); 641 642 // FIXME: It's a little ugly that we need to cast to a pointer, 643 // apply the GEP and then cast back. 644 C = llvm::ConstantExpr::getBitCast(C, Type); 645 C = llvm::ConstantExpr::getGetElementPtr(C, &Offset, 1); 646 647 return llvm::ConstantExpr::getBitCast(C, DestType); 648 } 649 650 return llvm::ConstantExpr::getIntToPtr(Offset, 651 getTypes().ConvertType(type)); 652 } 653 case APValue::Int: { 654 llvm::Constant *C = llvm::ConstantInt::get(V.getInt()); 655 656 if (C->getType() == llvm::Type::Int1Ty) { 657 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 658 C = llvm::ConstantExpr::getZExt(C, BoolTy); 659 } 660 return C; 661 } 662 case APValue::Float: 663 return llvm::ConstantFP::get(V.getFloat()); 664 case APValue::ComplexFloat: { 665 llvm::Constant *Complex[2]; 666 667 Complex[0] = llvm::ConstantFP::get(V.getComplexFloatReal()); 668 Complex[1] = llvm::ConstantFP::get(V.getComplexFloatImag()); 669 670 return llvm::ConstantStruct::get(Complex, 2); 671 } 672 } 673 } 674 675 llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E)); 676 if (C->getType() == llvm::Type::Int1Ty) { 677 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 678 C = llvm::ConstantExpr::getZExt(C, BoolTy); 679 } 680 return C; 681} 682