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 "CGRecordLayout.h" 18 #include "clang/AST/APValue.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/RecordLayout.h" 21 #include "clang/AST/StmtVisitor.h" 22 #include "clang/Basic/Builtins.h" 23 #include "llvm/Constants.h" 24 #include "llvm/Function.h" 25 #include "llvm/GlobalVariable.h" 26 #include "llvm/Target/TargetData.h" 27 using namespace clang; 28 using namespace CodeGen; 29 30 //===----------------------------------------------------------------------===// 31 // ConstStructBuilder 32 //===----------------------------------------------------------------------===// 33 34 namespace { 35 class ConstStructBuilder { 36 CodeGenModule &CGM; 37 CodeGenFunction *CGF; 38 39 bool Packed; 40 unsigned NextFieldOffsetInBytes; 41 unsigned LLVMStructAlignment; 42 std::vector<llvm::Constant *> Elements; 43 public: 44 static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF, 45 InitListExpr *ILE); 46 47 private: 48 ConstStructBuilder(CodeGenModule &CGM, CodeGenFunction *CGF) 49 : CGM(CGM), CGF(CGF), Packed(false), NextFieldOffsetInBytes(0), 50 LLVMStructAlignment(1) { } 51 52 bool AppendField(const FieldDecl *Field, uint64_t FieldOffset, 53 const Expr *InitExpr); 54 55 bool AppendBitField(const FieldDecl *Field, uint64_t FieldOffset, 56 const Expr *InitExpr); 57 58 void AppendPadding(uint64_t NumBytes); 59 60 void AppendTailPadding(uint64_t RecordSize); 61 62 void ConvertStructToPacked(); 63 64 bool Build(InitListExpr *ILE); 65 66 unsigned getAlignment(const llvm::Constant *C) const { 67 if (Packed) return 1; 68 return CGM.getTargetData().getABITypeAlignment(C->getType()); 69 } 70 71 uint64_t getSizeInBytes(const llvm::Constant *C) const { 72 return CGM.getTargetData().getTypeAllocSize(C->getType()); 73 } 74 }; 75 76 bool ConstStructBuilder:: 77 AppendField(const FieldDecl *Field, uint64_t FieldOffset, const Expr *InitExpr){ 78 uint64_t FieldOffsetInBytes = FieldOffset / 8; 79 80 assert(NextFieldOffsetInBytes <= FieldOffsetInBytes 81 && "Field offset mismatch!"); 82 83 // Emit the field. 84 llvm::Constant *C = CGM.EmitConstantExpr(InitExpr, Field->getType(), CGF); 85 if (!C) 86 return false; 87 88 unsigned FieldAlignment = getAlignment(C); 89 90 // Round up the field offset to the alignment of the field type. 91 uint64_t AlignedNextFieldOffsetInBytes = 92 llvm::RoundUpToAlignment(NextFieldOffsetInBytes, FieldAlignment); 93 94 if (AlignedNextFieldOffsetInBytes > FieldOffsetInBytes) { 95 assert(!Packed && "Alignment is wrong even with a packed struct!"); 96 97 // Convert the struct to a packed struct. 98 ConvertStructToPacked(); 99 100 AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes; 101 } 102 103 if (AlignedNextFieldOffsetInBytes < FieldOffsetInBytes) { 104 // We need to append padding. 105 AppendPadding(FieldOffsetInBytes - NextFieldOffsetInBytes); 106 107 assert(NextFieldOffsetInBytes == FieldOffsetInBytes && 108 "Did not add enough padding!"); 109 110 AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes; 111 } 112 113 // Add the field. 114 Elements.push_back(C); 115 NextFieldOffsetInBytes = AlignedNextFieldOffsetInBytes + getSizeInBytes(C); 116 117 if (Packed) 118 assert(LLVMStructAlignment == 1 && "Packed struct not byte-aligned!"); 119 else 120 LLVMStructAlignment = std::max(LLVMStructAlignment, FieldAlignment); 121 122 return true; 123 } 124 125 bool ConstStructBuilder:: 126 AppendBitField(const FieldDecl *Field, uint64_t FieldOffset, 127 const Expr *InitExpr) { 128 llvm::ConstantInt *CI = 129 cast_or_null<llvm::ConstantInt>(CGM.EmitConstantExpr(InitExpr, 130 Field->getType(), 131 CGF)); 132 // FIXME: Can this ever happen? 133 if (!CI) 134 return false; 135 136 if (FieldOffset > NextFieldOffsetInBytes * 8) { 137 // We need to add padding. 138 uint64_t NumBytes = 139 llvm::RoundUpToAlignment(FieldOffset - 140 NextFieldOffsetInBytes * 8, 8) / 8; 141 142 AppendPadding(NumBytes); 143 } 144 145 uint64_t FieldSize = 146 Field->getBitWidth()->EvaluateAsInt(CGM.getContext()).getZExtValue(); 147 148 llvm::APInt FieldValue = CI->getValue(); 149 150 // Promote the size of FieldValue if necessary 151 // FIXME: This should never occur, but currently it can because initializer 152 // constants are cast to bool, and because clang is not enforcing bitfield 153 // width limits. 154 if (FieldSize > FieldValue.getBitWidth()) 155 FieldValue.zext(FieldSize); 156 157 // Truncate the size of FieldValue to the bit field size. 158 if (FieldSize < FieldValue.getBitWidth()) 159 FieldValue.trunc(FieldSize); 160 161 if (FieldOffset < NextFieldOffsetInBytes * 8) { 162 // Either part of the field or the entire field can go into the previous 163 // byte. 164 assert(!Elements.empty() && "Elements can't be empty!"); 165 166 unsigned BitsInPreviousByte = 167 NextFieldOffsetInBytes * 8 - FieldOffset; 168 169 bool FitsCompletelyInPreviousByte = 170 BitsInPreviousByte >= FieldValue.getBitWidth(); 171 172 llvm::APInt Tmp = FieldValue; 173 174 if (!FitsCompletelyInPreviousByte) { 175 unsigned NewFieldWidth = FieldSize - BitsInPreviousByte; 176 177 if (CGM.getTargetData().isBigEndian()) { 178 Tmp = Tmp.lshr(NewFieldWidth); 179 Tmp.trunc(BitsInPreviousByte); 180 181 // We want the remaining high bits. 182 FieldValue.trunc(NewFieldWidth); 183 } else { 184 Tmp.trunc(BitsInPreviousByte); 185 186 // We want the remaining low bits. 187 FieldValue = FieldValue.lshr(BitsInPreviousByte); 188 FieldValue.trunc(NewFieldWidth); 189 } 190 } 191 192 Tmp.zext(8); 193 if (CGM.getTargetData().isBigEndian()) { 194 if (FitsCompletelyInPreviousByte) 195 Tmp = Tmp.shl(BitsInPreviousByte - FieldValue.getBitWidth()); 196 } else { 197 Tmp = Tmp.shl(8 - BitsInPreviousByte); 198 } 199 200 // Or in the bits that go into the previous byte. 201 if (llvm::ConstantInt *Val = dyn_cast<llvm::ConstantInt>(Elements.back())) 202 Tmp |= Val->getValue(); 203 else 204 assert(isa<llvm::UndefValue>(Elements.back())); 205 206 Elements.back() = llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp); 207 208 if (FitsCompletelyInPreviousByte) 209 return true; 210 } 211 212 while (FieldValue.getBitWidth() > 8) { 213 llvm::APInt Tmp; 214 215 if (CGM.getTargetData().isBigEndian()) { 216 // We want the high bits. 217 Tmp = FieldValue; 218 Tmp = Tmp.lshr(Tmp.getBitWidth() - 8); 219 Tmp.trunc(8); 220 } else { 221 // We want the low bits. 222 Tmp = FieldValue; 223 Tmp.trunc(8); 224 225 FieldValue = FieldValue.lshr(8); 226 } 227 228 Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp)); 229 NextFieldOffsetInBytes++; 230 231 FieldValue.trunc(FieldValue.getBitWidth() - 8); 232 } 233 234 assert(FieldValue.getBitWidth() > 0 && 235 "Should have at least one bit left!"); 236 assert(FieldValue.getBitWidth() <= 8 && 237 "Should not have more than a byte left!"); 238 239 if (FieldValue.getBitWidth() < 8) { 240 if (CGM.getTargetData().isBigEndian()) { 241 unsigned BitWidth = FieldValue.getBitWidth(); 242 243 FieldValue.zext(8); 244 FieldValue = FieldValue << (8 - BitWidth); 245 } else 246 FieldValue.zext(8); 247 } 248 249 // Append the last element. 250 Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(), 251 FieldValue)); 252 NextFieldOffsetInBytes++; 253 return true; 254 } 255 256 void ConstStructBuilder::AppendPadding(uint64_t NumBytes) { 257 if (!NumBytes) 258 return; 259 260 const llvm::Type *Ty = llvm::Type::getInt8Ty(CGM.getLLVMContext()); 261 if (NumBytes > 1) 262 Ty = llvm::ArrayType::get(Ty, NumBytes); 263 264 llvm::Constant *C = llvm::Constant::getNullValue(Ty); 265 Elements.push_back(C); 266 assert(getAlignment(C) == 1 && "Padding must have 1 byte alignment!"); 267 268 NextFieldOffsetInBytes += getSizeInBytes(C); 269 } 270 271 void ConstStructBuilder::AppendTailPadding(uint64_t RecordSize) { 272 assert(RecordSize % 8 == 0 && "Invalid record size!"); 273 274 uint64_t RecordSizeInBytes = RecordSize / 8; 275 assert(NextFieldOffsetInBytes <= RecordSizeInBytes && "Size mismatch!"); 276 277 unsigned NumPadBytes = RecordSizeInBytes - NextFieldOffsetInBytes; 278 AppendPadding(NumPadBytes); 279 } 280 281 void ConstStructBuilder::ConvertStructToPacked() { 282 std::vector<llvm::Constant *> PackedElements; 283 uint64_t ElementOffsetInBytes = 0; 284 285 for (unsigned i = 0, e = Elements.size(); i != e; ++i) { 286 llvm::Constant *C = Elements[i]; 287 288 unsigned ElementAlign = 289 CGM.getTargetData().getABITypeAlignment(C->getType()); 290 uint64_t AlignedElementOffsetInBytes = 291 llvm::RoundUpToAlignment(ElementOffsetInBytes, ElementAlign); 292 293 if (AlignedElementOffsetInBytes > ElementOffsetInBytes) { 294 // We need some padding. 295 uint64_t NumBytes = 296 AlignedElementOffsetInBytes - ElementOffsetInBytes; 297 298 const llvm::Type *Ty = llvm::Type::getInt8Ty(CGM.getLLVMContext()); 299 if (NumBytes > 1) 300 Ty = llvm::ArrayType::get(Ty, NumBytes); 301 302 llvm::Constant *Padding = llvm::Constant::getNullValue(Ty); 303 PackedElements.push_back(Padding); 304 ElementOffsetInBytes += getSizeInBytes(Padding); 305 } 306 307 PackedElements.push_back(C); 308 ElementOffsetInBytes += getSizeInBytes(C); 309 } 310 311 assert(ElementOffsetInBytes == NextFieldOffsetInBytes && 312 "Packing the struct changed its size!"); 313 314 Elements = PackedElements; 315 LLVMStructAlignment = 1; 316 Packed = true; 317 } 318 319 bool ConstStructBuilder::Build(InitListExpr *ILE) { 320 RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl(); 321 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); 322 323 unsigned FieldNo = 0; 324 unsigned ElementNo = 0; 325 for (RecordDecl::field_iterator Field = RD->field_begin(), 326 FieldEnd = RD->field_end(); 327 ElementNo < ILE->getNumInits() && Field != FieldEnd; 328 ++Field, ++FieldNo) { 329 if (RD->isUnion() && ILE->getInitializedFieldInUnion() != *Field) 330 continue; 331 332 if (Field->isBitField()) { 333 if (!Field->getIdentifier()) 334 continue; 335 336 if (!AppendBitField(*Field, Layout.getFieldOffset(FieldNo), 337 ILE->getInit(ElementNo))) 338 return false; 339 } else { 340 if (!AppendField(*Field, Layout.getFieldOffset(FieldNo), 341 ILE->getInit(ElementNo))) 342 return false; 343 } 344 345 ElementNo++; 346 } 347 348 uint64_t LayoutSizeInBytes = Layout.getSize() / 8; 349 350 if (NextFieldOffsetInBytes > LayoutSizeInBytes) { 351 // If the struct is bigger than the size of the record type, 352 // we must have a flexible array member at the end. 353 assert(RD->hasFlexibleArrayMember() && 354 "Must have flexible array member if struct is bigger than type!"); 355 356 // No tail padding is necessary. 357 return true; 358 } 359 360 uint64_t LLVMSizeInBytes = llvm::RoundUpToAlignment(NextFieldOffsetInBytes, 361 LLVMStructAlignment); 362 363 // Check if we need to convert the struct to a packed struct. 364 if (NextFieldOffsetInBytes <= LayoutSizeInBytes && 365 LLVMSizeInBytes > LayoutSizeInBytes) { 366 assert(!Packed && "Size mismatch!"); 367 368 ConvertStructToPacked(); 369 assert(NextFieldOffsetInBytes == LayoutSizeInBytes && 370 "Converting to packed did not help!"); 371 } 372 373 // Append tail padding if necessary. 374 AppendTailPadding(Layout.getSize()); 375 376 assert(Layout.getSize() / 8 == NextFieldOffsetInBytes && 377 "Tail padding mismatch!"); 378 379 return true; 380 } 381 382 llvm::Constant *ConstStructBuilder:: 383 BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF, InitListExpr *ILE) { 384 ConstStructBuilder Builder(CGM, CGF); 385 386 if (!Builder.Build(ILE)) 387 return 0; 388 389 llvm::Constant *Result = 390 llvm::ConstantStruct::get(CGM.getLLVMContext(), 391 Builder.Elements, Builder.Packed); 392 393 assert(llvm::RoundUpToAlignment(Builder.NextFieldOffsetInBytes, 394 Builder.getAlignment(Result)) == 395 Builder.getSizeInBytes(Result) && "Size mismatch!"); 396 397 return Result; 398 } 399 400 401 //===----------------------------------------------------------------------===// 402 // ConstExprEmitter 403 //===----------------------------------------------------------------------===// 404 405 class ConstExprEmitter : 406 public StmtVisitor<ConstExprEmitter, llvm::Constant*> { 407 CodeGenModule &CGM; 408 CodeGenFunction *CGF; 409 llvm::LLVMContext &VMContext; 410 public: 411 ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf) 412 : CGM(cgm), CGF(cgf), VMContext(cgm.getLLVMContext()) { 413 } 414 415 //===--------------------------------------------------------------------===// 416 // Visitor Methods 417 //===--------------------------------------------------------------------===// 418 419 llvm::Constant *VisitStmt(Stmt *S) { 420 return 0; 421 } 422 423 llvm::Constant *VisitParenExpr(ParenExpr *PE) { 424 return Visit(PE->getSubExpr()); 425 } 426 427 llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 428 return Visit(E->getInitializer()); 429 } 430 431 llvm::Constant *EmitMemberFunctionPointer(CXXMethodDecl *MD) { 432 assert(MD->isInstance() && "Member function must not be static!"); 433 434 MD = MD->getCanonicalDecl(); 435 436 const llvm::Type *PtrDiffTy = 437 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 438 439 llvm::Constant *Values[2]; 440 441 // Get the function pointer (or index if this is a virtual function). 442 if (MD->isVirtual()) { 443 uint64_t Index = CGM.getVTables().getMethodVtableIndex(MD); 444 445 // Itanium C++ ABI 2.3: 446 // For a non-virtual function, this field is a simple function pointer. 447 // For a virtual function, it is 1 plus the virtual table offset 448 // (in bytes) of the function, represented as a ptrdiff_t. 449 Values[0] = llvm::ConstantInt::get(PtrDiffTy, (Index * 8) + 1); 450 } else { 451 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); 452 const llvm::Type *Ty = 453 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 454 FPT->isVariadic()); 455 456 llvm::Constant *FuncPtr = CGM.GetAddrOfFunction(MD, Ty); 457 Values[0] = llvm::ConstantExpr::getPtrToInt(FuncPtr, PtrDiffTy); 458 } 459 460 // The adjustment will always be 0. 461 Values[1] = llvm::ConstantInt::get(PtrDiffTy, 0); 462 463 return llvm::ConstantStruct::get(CGM.getLLVMContext(), 464 Values, 2, /*Packed=*/false); 465 } 466 467 llvm::Constant *VisitUnaryAddrOf(UnaryOperator *E) { 468 if (const MemberPointerType *MPT = 469 E->getType()->getAs<MemberPointerType>()) { 470 QualType T = MPT->getPointeeType(); 471 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getSubExpr()); 472 473 NamedDecl *ND = DRE->getDecl(); 474 if (T->isFunctionProtoType()) 475 return EmitMemberFunctionPointer(cast<CXXMethodDecl>(ND)); 476 477 // We have a pointer to data member. 478 return CGM.EmitPointerToDataMember(cast<FieldDecl>(ND)); 479 } 480 481 return 0; 482 } 483 484 llvm::Constant *VisitBinSub(BinaryOperator *E) { 485 // This must be a pointer/pointer subtraction. This only happens for 486 // address of label. 487 if (!isa<AddrLabelExpr>(E->getLHS()->IgnoreParenNoopCasts(CGM.getContext())) || 488 !isa<AddrLabelExpr>(E->getRHS()->IgnoreParenNoopCasts(CGM.getContext()))) 489 return 0; 490 491 llvm::Constant *LHS = CGM.EmitConstantExpr(E->getLHS(), 492 E->getLHS()->getType(), CGF); 493 llvm::Constant *RHS = CGM.EmitConstantExpr(E->getRHS(), 494 E->getRHS()->getType(), CGF); 495 496 const llvm::Type *ResultType = ConvertType(E->getType()); 497 LHS = llvm::ConstantExpr::getPtrToInt(LHS, ResultType); 498 RHS = llvm::ConstantExpr::getPtrToInt(RHS, ResultType); 499 500 // No need to divide by element size, since addr of label is always void*, 501 // which has size 1 in GNUish. 502 return llvm::ConstantExpr::getSub(LHS, RHS); 503 } 504 505 llvm::Constant *VisitCastExpr(CastExpr* E) { 506 switch (E->getCastKind()) { 507 case CastExpr::CK_ToUnion: { 508 // GCC cast to union extension 509 assert(E->getType()->isUnionType() && 510 "Destination type is not union type!"); 511 const llvm::Type *Ty = ConvertType(E->getType()); 512 Expr *SubExpr = E->getSubExpr(); 513 514 llvm::Constant *C = 515 CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF); 516 if (!C) 517 return 0; 518 519 // Build a struct with the union sub-element as the first member, 520 // and padded to the appropriate size 521 std::vector<llvm::Constant*> Elts; 522 std::vector<const llvm::Type*> Types; 523 Elts.push_back(C); 524 Types.push_back(C->getType()); 525 unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType()); 526 unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty); 527 528 assert(CurSize <= TotalSize && "Union size mismatch!"); 529 if (unsigned NumPadBytes = TotalSize - CurSize) { 530 const llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext); 531 if (NumPadBytes > 1) 532 Ty = llvm::ArrayType::get(Ty, NumPadBytes); 533 534 Elts.push_back(llvm::Constant::getNullValue(Ty)); 535 Types.push_back(Ty); 536 } 537 538 llvm::StructType* STy = 539 llvm::StructType::get(C->getType()->getContext(), Types, false); 540 return llvm::ConstantStruct::get(STy, Elts); 541 } 542 case CastExpr::CK_NullToMemberPointer: 543 return CGM.EmitNullConstant(E->getType()); 544 545 case CastExpr::CK_BaseToDerivedMemberPointer: { 546 Expr *SubExpr = E->getSubExpr(); 547 548 const MemberPointerType *SrcTy = 549 SubExpr->getType()->getAs<MemberPointerType>(); 550 const MemberPointerType *DestTy = 551 E->getType()->getAs<MemberPointerType>(); 552 553 const CXXRecordDecl *BaseClass = 554 cast<CXXRecordDecl>(cast<RecordType>(SrcTy->getClass())->getDecl()); 555 const CXXRecordDecl *DerivedClass = 556 cast<CXXRecordDecl>(cast<RecordType>(DestTy->getClass())->getDecl()); 557 558 if (SrcTy->getPointeeType()->isFunctionProtoType()) { 559 llvm::Constant *C = 560 CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF); 561 if (!C) 562 return 0; 563 564 llvm::ConstantStruct *CS = cast<llvm::ConstantStruct>(C); 565 566 // Check if we need to update the adjustment. 567 if (llvm::Constant *Offset = 568 CGM.GetNonVirtualBaseClassOffset(DerivedClass, BaseClass)) { 569 llvm::Constant *Values[2]; 570 571 Values[0] = CS->getOperand(0); 572 Values[1] = llvm::ConstantExpr::getAdd(CS->getOperand(1), Offset); 573 return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2, 574 /*Packed=*/false); 575 } 576 577 return CS; 578 } 579 } 580 581 case CastExpr::CK_BitCast: 582 // This must be a member function pointer cast. 583 return Visit(E->getSubExpr()); 584 585 default: { 586 // FIXME: This should be handled by the CK_NoOp cast kind. 587 // Explicit and implicit no-op casts 588 QualType Ty = E->getType(), SubTy = E->getSubExpr()->getType(); 589 if (CGM.getContext().hasSameUnqualifiedType(Ty, SubTy)) 590 return Visit(E->getSubExpr()); 591 592 // Handle integer->integer casts for address-of-label differences. 593 if (Ty->isIntegerType() && SubTy->isIntegerType() && 594 CGF) { 595 llvm::Value *Src = Visit(E->getSubExpr()); 596 if (Src == 0) return 0; 597 598 // Use EmitScalarConversion to perform the conversion. 599 return cast<llvm::Constant>(CGF->EmitScalarConversion(Src, SubTy, Ty)); 600 } 601 602 return 0; 603 } 604 } 605 } 606 607 llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { 608 return Visit(DAE->getExpr()); 609 } 610 611 llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) { 612 std::vector<llvm::Constant*> Elts; 613 const llvm::ArrayType *AType = 614 cast<llvm::ArrayType>(ConvertType(ILE->getType())); 615 unsigned NumInitElements = ILE->getNumInits(); 616 // FIXME: Check for wide strings 617 // FIXME: Check for NumInitElements exactly equal to 1?? 618 if (NumInitElements > 0 && 619 (isa<StringLiteral>(ILE->getInit(0)) || 620 isa<ObjCEncodeExpr>(ILE->getInit(0))) && 621 ILE->getType()->getArrayElementTypeNoTypeQual()->isCharType()) 622 return Visit(ILE->getInit(0)); 623 const llvm::Type *ElemTy = AType->getElementType(); 624 unsigned NumElements = AType->getNumElements(); 625 626 // Initialising an array requires us to automatically 627 // initialise any elements that have not been initialised explicitly 628 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 629 630 // Copy initializer elements. 631 unsigned i = 0; 632 bool RewriteType = false; 633 for (; i < NumInitableElts; ++i) { 634 Expr *Init = ILE->getInit(i); 635 llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF); 636 if (!C) 637 return 0; 638 RewriteType |= (C->getType() != ElemTy); 639 Elts.push_back(C); 640 } 641 642 // Initialize remaining array elements. 643 // FIXME: This doesn't handle member pointers correctly! 644 for (; i < NumElements; ++i) 645 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 646 647 if (RewriteType) { 648 // FIXME: Try to avoid packing the array 649 std::vector<const llvm::Type*> Types; 650 for (unsigned i = 0; i < Elts.size(); ++i) 651 Types.push_back(Elts[i]->getType()); 652 const llvm::StructType *SType = llvm::StructType::get(AType->getContext(), 653 Types, true); 654 return llvm::ConstantStruct::get(SType, Elts); 655 } 656 657 return llvm::ConstantArray::get(AType, Elts); 658 } 659 660 llvm::Constant *EmitStructInitialization(InitListExpr *ILE) { 661 return ConstStructBuilder::BuildStruct(CGM, CGF, ILE); 662 } 663 664 llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) { 665 return ConstStructBuilder::BuildStruct(CGM, CGF, ILE); 666 } 667 668 llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) { 669 return CGM.EmitNullConstant(E->getType()); 670 } 671 672 llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { 673 if (ILE->getType()->isScalarType()) { 674 // We have a scalar in braces. Just use the first element. 675 if (ILE->getNumInits() > 0) { 676 Expr *Init = ILE->getInit(0); 677 return CGM.EmitConstantExpr(Init, Init->getType(), CGF); 678 } 679 return CGM.EmitNullConstant(ILE->getType()); 680 } 681 682 if (ILE->getType()->isArrayType()) 683 return EmitArrayInitialization(ILE); 684 685 if (ILE->getType()->isRecordType()) 686 return EmitStructInitialization(ILE); 687 688 if (ILE->getType()->isUnionType()) 689 return EmitUnionInitialization(ILE); 690 691 // If ILE was a constant vector, we would have handled it already. 692 if (ILE->getType()->isVectorType()) 693 return 0; 694 695 assert(0 && "Unable to handle InitListExpr"); 696 // Get rid of control reaches end of void function warning. 697 // Not reached. 698 return 0; 699 } 700 701 llvm::Constant *VisitCXXConstructExpr(CXXConstructExpr *E) { 702 if (!E->getConstructor()->isTrivial()) 703 return 0; 704 705 QualType Ty = E->getType(); 706 707 // FIXME: We should not have to call getBaseElementType here. 708 const RecordType *RT = 709 CGM.getContext().getBaseElementType(Ty)->getAs<RecordType>(); 710 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 711 712 // If the class doesn't have a trivial destructor, we can't emit it as a 713 // constant expr. 714 if (!RD->hasTrivialDestructor()) 715 return 0; 716 717 // Only copy and default constructors can be trivial. 718 719 720 if (E->getNumArgs()) { 721 assert(E->getNumArgs() == 1 && "trivial ctor with > 1 argument"); 722 assert(E->getConstructor()->isCopyConstructor() && 723 "trivial ctor has argument but isn't a copy ctor"); 724 725 Expr *Arg = E->getArg(0); 726 assert(CGM.getContext().hasSameUnqualifiedType(Ty, Arg->getType()) && 727 "argument to copy ctor is of wrong type"); 728 729 return Visit(Arg); 730 } 731 732 return CGM.EmitNullConstant(Ty); 733 } 734 735 llvm::Constant *VisitStringLiteral(StringLiteral *E) { 736 assert(!E->getType()->isPointerType() && "Strings are always arrays"); 737 738 // This must be a string initializing an array in a static initializer. 739 // Don't emit it as the address of the string, emit the string data itself 740 // as an inline array. 741 return llvm::ConstantArray::get(VMContext, 742 CGM.GetStringForStringLiteral(E), false); 743 } 744 745 llvm::Constant *VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 746 // This must be an @encode initializing an array in a static initializer. 747 // Don't emit it as the address of the string, emit the string data itself 748 // as an inline array. 749 std::string Str; 750 CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str); 751 const ConstantArrayType *CAT = cast<ConstantArrayType>(E->getType()); 752 753 // Resize the string to the right size, adding zeros at the end, or 754 // truncating as needed. 755 Str.resize(CAT->getSize().getZExtValue(), '\0'); 756 return llvm::ConstantArray::get(VMContext, Str, false); 757 } 758 759 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) { 760 return Visit(E->getSubExpr()); 761 } 762 763 // Utility methods 764 const llvm::Type *ConvertType(QualType T) { 765 return CGM.getTypes().ConvertType(T); 766 } 767 768 public: 769 llvm::Constant *EmitLValue(Expr *E) { 770 switch (E->getStmtClass()) { 771 default: break; 772 case Expr::CompoundLiteralExprClass: { 773 // Note that due to the nature of compound literals, this is guaranteed 774 // to be the only use of the variable, so we just generate it here. 775 CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E); 776 llvm::Constant* C = Visit(CLE->getInitializer()); 777 // FIXME: "Leaked" on failure. 778 if (C) 779 C = new llvm::GlobalVariable(CGM.getModule(), C->getType(), 780 E->getType().isConstant(CGM.getContext()), 781 llvm::GlobalValue::InternalLinkage, 782 C, ".compoundliteral", 0, false, 783 E->getType().getAddressSpace()); 784 return C; 785 } 786 case Expr::DeclRefExprClass: { 787 ValueDecl *Decl = cast<DeclRefExpr>(E)->getDecl(); 788 if (Decl->hasAttr<WeakRefAttr>()) 789 return CGM.GetWeakRefReference(Decl); 790 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl)) 791 return CGM.GetAddrOfFunction(FD); 792 if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) { 793 // We can never refer to a variable with local storage. 794 if (!VD->hasLocalStorage()) { 795 if (VD->isFileVarDecl() || VD->hasExternalStorage()) 796 return CGM.GetAddrOfGlobalVar(VD); 797 else if (VD->isBlockVarDecl()) { 798 assert(CGF && "Can't access static local vars without CGF"); 799 return CGF->GetAddrOfStaticLocalVar(VD); 800 } 801 } 802 } 803 break; 804 } 805 case Expr::StringLiteralClass: 806 return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E)); 807 case Expr::ObjCEncodeExprClass: 808 return CGM.GetAddrOfConstantStringFromObjCEncode(cast<ObjCEncodeExpr>(E)); 809 case Expr::ObjCStringLiteralClass: { 810 ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E); 811 llvm::Constant *C = 812 CGM.getObjCRuntime().GenerateConstantString(SL->getString()); 813 return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); 814 } 815 case Expr::PredefinedExprClass: { 816 unsigned Type = cast<PredefinedExpr>(E)->getIdentType(); 817 if (CGF) { 818 LValue Res = CGF->EmitPredefinedFunctionName(Type); 819 return cast<llvm::Constant>(Res.getAddress()); 820 } else if (Type == PredefinedExpr::PrettyFunction) { 821 return CGM.GetAddrOfConstantCString("top level", ".tmp"); 822 } 823 824 return CGM.GetAddrOfConstantCString("", ".tmp"); 825 } 826 case Expr::AddrLabelExprClass: { 827 assert(CGF && "Invalid address of label expression outside function."); 828 llvm::Constant *Ptr = 829 CGF->GetAddrOfLabel(cast<AddrLabelExpr>(E)->getLabel()); 830 return llvm::ConstantExpr::getBitCast(Ptr, ConvertType(E->getType())); 831 } 832 case Expr::CallExprClass: { 833 CallExpr* CE = cast<CallExpr>(E); 834 unsigned builtin = CE->isBuiltinCall(CGM.getContext()); 835 if (builtin != 836 Builtin::BI__builtin___CFStringMakeConstantString && 837 builtin != 838 Builtin::BI__builtin___NSStringMakeConstantString) 839 break; 840 const Expr *Arg = CE->getArg(0)->IgnoreParenCasts(); 841 const StringLiteral *Literal = cast<StringLiteral>(Arg); 842 if (builtin == 843 Builtin::BI__builtin___NSStringMakeConstantString) { 844 return CGM.getObjCRuntime().GenerateConstantString(Literal); 845 } 846 // FIXME: need to deal with UCN conversion issues. 847 return CGM.GetAddrOfConstantCFString(Literal); 848 } 849 case Expr::BlockExprClass: { 850 std::string FunctionName; 851 if (CGF) 852 FunctionName = CGF->CurFn->getName(); 853 else 854 FunctionName = "global"; 855 856 return CGM.GetAddrOfGlobalBlock(cast<BlockExpr>(E), FunctionName.c_str()); 857 } 858 } 859 860 return 0; 861 } 862 }; 863 864 } // end anonymous namespace. 865 866 llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, 867 QualType DestType, 868 CodeGenFunction *CGF) { 869 Expr::EvalResult Result; 870 871 bool Success = false; 872 873 if (DestType->isReferenceType()) 874 Success = E->EvaluateAsLValue(Result, Context); 875 else 876 Success = E->Evaluate(Result, Context); 877 878 if (Success && !Result.HasSideEffects) { 879 switch (Result.Val.getKind()) { 880 case APValue::Uninitialized: 881 assert(0 && "Constant expressions should be initialized."); 882 return 0; 883 case APValue::LValue: { 884 const llvm::Type *DestTy = getTypes().ConvertTypeForMem(DestType); 885 llvm::Constant *Offset = 886 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), 887 Result.Val.getLValueOffset().getQuantity()); 888 889 llvm::Constant *C; 890 if (const Expr *LVBase = Result.Val.getLValueBase()) { 891 C = ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase)); 892 893 // Apply offset if necessary. 894 if (!Offset->isNullValue()) { 895 const llvm::Type *Type = llvm::Type::getInt8PtrTy(VMContext); 896 llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, Type); 897 Casted = llvm::ConstantExpr::getGetElementPtr(Casted, &Offset, 1); 898 C = llvm::ConstantExpr::getBitCast(Casted, C->getType()); 899 } 900 901 // Convert to the appropriate type; this could be an lvalue for 902 // an integer. 903 if (isa<llvm::PointerType>(DestTy)) 904 return llvm::ConstantExpr::getBitCast(C, DestTy); 905 906 return llvm::ConstantExpr::getPtrToInt(C, DestTy); 907 } else { 908 C = Offset; 909 910 // Convert to the appropriate type; this could be an lvalue for 911 // an integer. 912 if (isa<llvm::PointerType>(DestTy)) 913 return llvm::ConstantExpr::getIntToPtr(C, DestTy); 914 915 // If the types don't match this should only be a truncate. 916 if (C->getType() != DestTy) 917 return llvm::ConstantExpr::getTrunc(C, DestTy); 918 919 return C; 920 } 921 } 922 case APValue::Int: { 923 llvm::Constant *C = llvm::ConstantInt::get(VMContext, 924 Result.Val.getInt()); 925 926 if (C->getType() == llvm::Type::getInt1Ty(VMContext)) { 927 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 928 C = llvm::ConstantExpr::getZExt(C, BoolTy); 929 } 930 return C; 931 } 932 case APValue::ComplexInt: { 933 llvm::Constant *Complex[2]; 934 935 Complex[0] = llvm::ConstantInt::get(VMContext, 936 Result.Val.getComplexIntReal()); 937 Complex[1] = llvm::ConstantInt::get(VMContext, 938 Result.Val.getComplexIntImag()); 939 940 // FIXME: the target may want to specify that this is packed. 941 return llvm::ConstantStruct::get(VMContext, Complex, 2, false); 942 } 943 case APValue::Float: 944 return llvm::ConstantFP::get(VMContext, Result.Val.getFloat()); 945 case APValue::ComplexFloat: { 946 llvm::Constant *Complex[2]; 947 948 Complex[0] = llvm::ConstantFP::get(VMContext, 949 Result.Val.getComplexFloatReal()); 950 Complex[1] = llvm::ConstantFP::get(VMContext, 951 Result.Val.getComplexFloatImag()); 952 953 // FIXME: the target may want to specify that this is packed. 954 return llvm::ConstantStruct::get(VMContext, Complex, 2, false); 955 } 956 case APValue::Vector: { 957 llvm::SmallVector<llvm::Constant *, 4> Inits; 958 unsigned NumElts = Result.Val.getVectorLength(); 959 960 for (unsigned i = 0; i != NumElts; ++i) { 961 APValue &Elt = Result.Val.getVectorElt(i); 962 if (Elt.isInt()) 963 Inits.push_back(llvm::ConstantInt::get(VMContext, Elt.getInt())); 964 else 965 Inits.push_back(llvm::ConstantFP::get(VMContext, Elt.getFloat())); 966 } 967 return llvm::ConstantVector::get(&Inits[0], Inits.size()); 968 } 969 } 970 } 971 972 llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E)); 973 if (C && C->getType() == llvm::Type::getInt1Ty(VMContext)) { 974 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 975 C = llvm::ConstantExpr::getZExt(C, BoolTy); 976 } 977 return C; 978 } 979 980 static bool containsPointerToDataMember(CodeGenTypes &Types, QualType T) { 981 // No need to check for member pointers when not compiling C++. 982 if (!Types.getContext().getLangOptions().CPlusPlus) 983 return false; 984 985 T = Types.getContext().getBaseElementType(T); 986 987 if (const RecordType *RT = T->getAs<RecordType>()) { 988 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 989 990 // FIXME: It would be better if there was a way to explicitly compute the 991 // record layout instead of converting to a type. 992 Types.ConvertTagDeclType(RD); 993 994 const CGRecordLayout &Layout = Types.getCGRecordLayout(RD); 995 return Layout.containsPointerToDataMember(); 996 } 997 998 if (const MemberPointerType *MPT = T->getAs<MemberPointerType>()) 999 return !MPT->getPointeeType()->isFunctionType(); 1000 1001 return false; 1002 } 1003 1004 llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) { 1005 if (!containsPointerToDataMember(getTypes(), T)) 1006 return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T)); 1007 1008 if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) { 1009 1010 QualType ElementTy = CAT->getElementType(); 1011 1012 llvm::Constant *Element = EmitNullConstant(ElementTy); 1013 unsigned NumElements = CAT->getSize().getZExtValue(); 1014 std::vector<llvm::Constant *> Array(NumElements); 1015 for (unsigned i = 0; i != NumElements; ++i) 1016 Array[i] = Element; 1017 1018 const llvm::ArrayType *ATy = 1019 cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T)); 1020 return llvm::ConstantArray::get(ATy, Array); 1021 } 1022 1023 if (const RecordType *RT = T->getAs<RecordType>()) { 1024 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 1025 assert(!RD->getNumBases() && 1026 "FIXME: Handle zero-initializing structs with bases and " 1027 "pointers to data members."); 1028 const llvm::StructType *STy = 1029 cast<llvm::StructType>(getTypes().ConvertTypeForMem(T)); 1030 unsigned NumElements = STy->getNumElements(); 1031 std::vector<llvm::Constant *> Elements(NumElements); 1032 1033 for (RecordDecl::field_iterator I = RD->field_begin(), 1034 E = RD->field_end(); I != E; ++I) { 1035 const FieldDecl *FD = *I; 1036 1037 const CGRecordLayout &RL = 1038 getTypes().getCGRecordLayout(FD->getParent()); 1039 unsigned FieldNo = RL.getLLVMFieldNo(FD); 1040 Elements[FieldNo] = EmitNullConstant(FD->getType()); 1041 } 1042 1043 // Now go through all other fields and zero them out. 1044 for (unsigned i = 0; i != NumElements; ++i) { 1045 if (!Elements[i]) 1046 Elements[i] = llvm::Constant::getNullValue(STy->getElementType(i)); 1047 } 1048 1049 return llvm::ConstantStruct::get(STy, Elements); 1050 } 1051 1052 assert(!T->getAs<MemberPointerType>()->getPointeeType()->isFunctionType() && 1053 "Should only see pointers to data members here!"); 1054 1055 // Itanium C++ ABI 2.3: 1056 // A NULL pointer is represented as -1. 1057 return llvm::ConstantInt::get(getTypes().ConvertTypeForMem(T), -1ULL, 1058 /*isSigned=*/true); 1059 } 1060 1061 llvm::Constant * 1062 CodeGenModule::EmitPointerToDataMember(const FieldDecl *FD) { 1063 1064 // Itanium C++ ABI 2.3: 1065 // A pointer to data member is an offset from the base address of the class 1066 // object containing it, represented as a ptrdiff_t 1067 1068 const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(FD->getParent()); 1069 QualType ClassType = 1070 getContext().getTypeDeclType(const_cast<CXXRecordDecl *>(ClassDecl)); 1071 1072 const llvm::StructType *ClassLTy = 1073 cast<llvm::StructType>(getTypes().ConvertType(ClassType)); 1074 1075 const CGRecordLayout &RL = 1076 getTypes().getCGRecordLayout(FD->getParent()); 1077 unsigned FieldNo = RL.getLLVMFieldNo(FD); 1078 uint64_t Offset = 1079 getTargetData().getStructLayout(ClassLTy)->getElementOffset(FieldNo); 1080 1081 const llvm::Type *PtrDiffTy = 1082 getTypes().ConvertType(getContext().getPointerDiffType()); 1083 1084 return llvm::ConstantInt::get(PtrDiffTy, Offset); 1085 } 1086