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 "clang/AST/ASTContext.h" 17 #include "clang/AST/StmtVisitor.h" 18 #include "llvm/Constants.h" 19 #include "llvm/Function.h" 20 #include "llvm/GlobalVariable.h" 21 #include "llvm/Support/Compiler.h" 22 #include "llvm/Target/TargetData.h" 23 using namespace clang; 24 using namespace CodeGen; 25 26 namespace { 27 class VISIBILITY_HIDDEN ConstExprEmitter : 28 public StmtVisitor<ConstExprEmitter, llvm::Constant*> { 29 CodeGenModule &CGM; 30 CodeGenFunction *CGF; 31 public: 32 ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf) 33 : CGM(cgm), CGF(cgf) { 34 } 35 36 //===--------------------------------------------------------------------===// 37 // Visitor Methods 38 //===--------------------------------------------------------------------===// 39 40 llvm::Constant *VisitStmt(Stmt *S) { 41 CGM.WarnUnsupported(S, "constant expression"); 42 QualType T = cast<Expr>(S)->getType(); 43 return llvm::UndefValue::get(CGM.getTypes().ConvertType(T)); 44 } 45 46 llvm::Constant *VisitParenExpr(ParenExpr *PE) { 47 return Visit(PE->getSubExpr()); 48 } 49 50 // Leaves 51 llvm::Constant *VisitIntegerLiteral(const IntegerLiteral *E) { 52 return llvm::ConstantInt::get(E->getValue()); 53 } 54 llvm::Constant *VisitFloatingLiteral(const FloatingLiteral *E) { 55 return llvm::ConstantFP::get(E->getValue()); 56 } 57 llvm::Constant *VisitCharacterLiteral(const CharacterLiteral *E) { 58 return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); 59 } 60 llvm::Constant *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 61 return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); 62 } 63 llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) { 64 return CGM.getObjCRuntime().GenerateConstantString( 65 E->getString()->getStrData(), E->getString()->getByteLength()); 66 } 67 68 llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 69 return Visit(E->getInitializer()); 70 } 71 72 llvm::Constant *VisitCastExpr(const CastExpr* E) { 73 llvm::Constant *C = Visit(E->getSubExpr()); 74 75 return EmitConversion(C, E->getSubExpr()->getType(), E->getType()); 76 } 77 78 llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { 79 return Visit(DAE->getExpr()); 80 } 81 82 llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) { 83 std::vector<llvm::Constant*> Elts; 84 const llvm::ArrayType *AType = 85 cast<llvm::ArrayType>(ConvertType(ILE->getType())); 86 unsigned NumInitElements = ILE->getNumInits(); 87 // FIXME: Check for wide strings 88 if (NumInitElements > 0 && isa<StringLiteral>(ILE->getInit(0)) && 89 ILE->getType()->getArrayElementTypeNoTypeQual()->isCharType()) 90 return Visit(ILE->getInit(0)); 91 const llvm::Type *ElemTy = AType->getElementType(); 92 unsigned NumElements = AType->getNumElements(); 93 94 // Initialising an array requires us to automatically 95 // initialise any elements that have not been initialised explicitly 96 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 97 98 // Copy initializer elements. 99 unsigned i = 0; 100 bool RewriteType = false; 101 for (; i < NumInitableElts; ++i) { 102 llvm::Constant *C = Visit(ILE->getInit(i)); 103 RewriteType |= (C->getType() != ElemTy); 104 Elts.push_back(C); 105 } 106 107 // Initialize remaining array elements. 108 for (; i < NumElements; ++i) 109 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 110 111 if (RewriteType) { 112 // FIXME: Try to avoid packing the array 113 std::vector<const llvm::Type*> Types; 114 for (unsigned i = 0; i < Elts.size(); ++i) 115 Types.push_back(Elts[i]->getType()); 116 const llvm::StructType *SType = llvm::StructType::get(Types, true); 117 return llvm::ConstantStruct::get(SType, Elts); 118 } 119 120 return llvm::ConstantArray::get(AType, Elts); 121 } 122 123 void InsertBitfieldIntoStruct(std::vector<llvm::Constant*>& Elts, 124 FieldDecl* Field, Expr* E) { 125 // Calculate the value to insert 126 llvm::Constant *C = Visit(E); 127 llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C); 128 if (!CI) { 129 CGM.WarnUnsupported(E, "bitfield initialization"); 130 return; 131 } 132 llvm::APInt V = CI->getValue(); 133 134 // Calculate information about the relevant field 135 const llvm::Type* Ty = CI->getType(); 136 const llvm::TargetData &TD = CGM.getTypes().getTargetData(); 137 unsigned size = TD.getTypeStoreSizeInBits(Ty); 138 unsigned fieldOffset = CGM.getTypes().getLLVMFieldNo(Field) * size; 139 CodeGenTypes::BitFieldInfo bitFieldInfo = 140 CGM.getTypes().getBitFieldInfo(Field); 141 fieldOffset += bitFieldInfo.Begin; 142 143 // Find where to start the insertion 144 // FIXME: This is O(n^2) in the number of bit-fields! 145 // FIXME: This won't work if the struct isn't completely packed! 146 unsigned offset = 0, i = 0; 147 while (offset < (fieldOffset & -8)) 148 offset += TD.getTypeStoreSizeInBits(Elts[i++]->getType()); 149 150 // Advance over 0 sized elements (must terminate in bounds since 151 // the bitfield must have a size). 152 while (TD.getTypeStoreSizeInBits(Elts[i]->getType()) == 0) 153 ++i; 154 155 // Promote the size of V if necessary 156 // FIXME: This should never occur, but currently it can because 157 // initializer constants are cast to bool, and because clang is 158 // not enforcing bitfield width limits. 159 if (bitFieldInfo.Size > V.getBitWidth()) 160 V.zext(bitFieldInfo.Size); 161 162 // Insert the bits into the struct 163 // FIXME: This algorthm is only correct on X86! 164 // FIXME: THis algorthm assumes bit-fields only have byte-size elements! 165 unsigned bitsToInsert = bitFieldInfo.Size; 166 unsigned curBits = std::min(8 - (fieldOffset & 7), bitsToInsert); 167 unsigned byte = V.getLoBits(curBits).getZExtValue() << (fieldOffset & 7); 168 do { 169 llvm::Constant* byteC = llvm::ConstantInt::get(llvm::Type::Int8Ty, byte); 170 Elts[i] = llvm::ConstantExpr::getOr(Elts[i], byteC); 171 ++i; 172 V = V.lshr(curBits); 173 bitsToInsert -= curBits; 174 175 if (!bitsToInsert) 176 break; 177 178 curBits = bitsToInsert > 8 ? 8 : bitsToInsert; 179 byte = V.getLoBits(curBits).getZExtValue(); 180 } while (true); 181 } 182 183 llvm::Constant *EmitStructInitialization(InitListExpr *ILE) { 184 const llvm::StructType *SType = 185 cast<llvm::StructType>(ConvertType(ILE->getType())); 186 RecordDecl *RD = ILE->getType()->getAsRecordType()->getDecl(); 187 std::vector<llvm::Constant*> Elts; 188 189 // Initialize the whole structure to zero. 190 for (unsigned i = 0; i < SType->getNumElements(); ++i) { 191 const llvm::Type *FieldTy = SType->getElementType(i); 192 Elts.push_back(llvm::Constant::getNullValue(FieldTy)); 193 } 194 195 // Copy initializer elements. Skip padding fields. 196 unsigned EltNo = 0; // Element no in ILE 197 int FieldNo = 0; // Field no in RecordDecl 198 bool RewriteType = false; 199 while (EltNo < ILE->getNumInits() && FieldNo < RD->getNumMembers()) { 200 FieldDecl* curField = RD->getMember(FieldNo); 201 FieldNo++; 202 if (!curField->getIdentifier()) 203 continue; 204 205 if (curField->isBitField()) { 206 InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(EltNo)); 207 } else { 208 unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(curField); 209 llvm::Constant* C = Visit(ILE->getInit(EltNo)); 210 RewriteType |= (C->getType() != Elts[FieldNo]->getType()); 211 Elts[FieldNo] = C; 212 } 213 EltNo++; 214 } 215 216 if (RewriteType) { 217 // FIXME: Make this work for non-packed structs 218 assert(SType->isPacked() && "Cannot recreate unpacked structs"); 219 std::vector<const llvm::Type*> Types; 220 for (unsigned i = 0; i < Elts.size(); ++i) 221 Types.push_back(Elts[i]->getType()); 222 SType = llvm::StructType::get(Types, true); 223 } 224 225 return llvm::ConstantStruct::get(SType, Elts); 226 } 227 228 llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) { 229 RecordDecl *RD = ILE->getType()->getAsRecordType()->getDecl(); 230 const llvm::Type *Ty = ConvertType(ILE->getType()); 231 232 // Find the field decl we're initializing, if any 233 int FieldNo = 0; // Field no in RecordDecl 234 FieldDecl* curField = 0; 235 while (FieldNo < RD->getNumMembers()) { 236 curField = RD->getMember(FieldNo); 237 FieldNo++; 238 if (curField->getIdentifier()) 239 break; 240 } 241 242 if (!curField || !curField->getIdentifier() || ILE->getNumInits() == 0) 243 return llvm::Constant::getNullValue(Ty); 244 245 if (curField->isBitField()) { 246 // Create a dummy struct for bit-field insertion 247 unsigned NumElts = CGM.getTargetData().getABITypeSize(Ty) / 8; 248 llvm::Constant* NV = llvm::Constant::getNullValue(llvm::Type::Int8Ty); 249 std::vector<llvm::Constant*> Elts(NumElts, NV); 250 251 InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(0)); 252 const llvm::ArrayType *RetTy = 253 llvm::ArrayType::get(NV->getType(), NumElts); 254 return llvm::ConstantArray::get(RetTy, Elts); 255 } 256 257 llvm::Constant *C = Visit(ILE->getInit(0)); 258 259 // Build a struct with the union sub-element as the first member, 260 // and padded to the appropriate size 261 std::vector<llvm::Constant*> Elts; 262 std::vector<const llvm::Type*> Types; 263 Elts.push_back(C); 264 Types.push_back(C->getType()); 265 unsigned CurSize = CGM.getTargetData().getTypeStoreSize(C->getType()); 266 unsigned TotalSize = CGM.getTargetData().getTypeStoreSize(Ty); 267 while (CurSize < TotalSize) { 268 Elts.push_back(llvm::Constant::getNullValue(llvm::Type::Int8Ty)); 269 Types.push_back(llvm::Type::Int8Ty); 270 CurSize++; 271 } 272 273 // This always generates a packed struct 274 // FIXME: Try to generate an unpacked struct when we can 275 llvm::StructType* STy = llvm::StructType::get(Types, true); 276 return llvm::ConstantStruct::get(STy, Elts); 277 } 278 279 llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) { 280 const llvm::VectorType *VType = 281 cast<llvm::VectorType>(ConvertType(ILE->getType())); 282 const llvm::Type *ElemTy = VType->getElementType(); 283 std::vector<llvm::Constant*> Elts; 284 unsigned NumElements = VType->getNumElements(); 285 unsigned NumInitElements = ILE->getNumInits(); 286 287 unsigned NumInitableElts = std::min(NumInitElements, NumElements); 288 289 // Copy initializer elements. 290 unsigned i = 0; 291 for (; i < NumInitableElts; ++i) { 292 llvm::Constant *C = Visit(ILE->getInit(i)); 293 Elts.push_back(C); 294 } 295 296 for (; i < NumElements; ++i) 297 Elts.push_back(llvm::Constant::getNullValue(ElemTy)); 298 299 return llvm::ConstantVector::get(VType, Elts); 300 } 301 302 llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { 303 if (ILE->getType()->isScalarType()) { 304 // We have a scalar in braces. Just use the first element. 305 if (ILE->getNumInits() > 0) 306 return Visit(ILE->getInit(0)); 307 308 const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType()); 309 return llvm::Constant::getNullValue(RetTy); 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 *VisitDeclRefExpr(DeclRefExpr *E) { 367 const ValueDecl *Decl = E->getDecl(); 368 if (const EnumConstantDecl *EC = dyn_cast<EnumConstantDecl>(Decl)) 369 return llvm::ConstantInt::get(EC->getInitVal()); 370 assert(0 && "Unsupported decl ref type!"); 371 return 0; 372 } 373 374 llvm::Constant *VisitSizeOfAlignOfTypeExpr(const SizeOfAlignOfTypeExpr *E) { 375 return EmitSizeAlignOf(E->getArgumentType(), E->getType(), E->isSizeOf()); 376 } 377 378 // Unary operators 379 llvm::Constant *VisitUnaryPlus(const UnaryOperator *E) { 380 return Visit(E->getSubExpr()); 381 } 382 llvm::Constant *VisitUnaryMinus(const UnaryOperator *E) { 383 return llvm::ConstantExpr::getNeg(Visit(E->getSubExpr())); 384 } 385 llvm::Constant *VisitUnaryNot(const UnaryOperator *E) { 386 return llvm::ConstantExpr::getNot(Visit(E->getSubExpr())); 387 } 388 llvm::Constant *VisitUnaryLNot(const UnaryOperator *E) { 389 llvm::Constant *SubExpr = Visit(E->getSubExpr()); 390 391 if (E->getSubExpr()->getType()->isRealFloatingType()) { 392 // Compare against 0.0 for fp scalars. 393 llvm::Constant *Zero = llvm::Constant::getNullValue(SubExpr->getType()); 394 SubExpr = llvm::ConstantExpr::getFCmp(llvm::FCmpInst::FCMP_UEQ, SubExpr, 395 Zero); 396 } else { 397 assert((E->getSubExpr()->getType()->isIntegerType() || 398 E->getSubExpr()->getType()->isPointerType()) && 399 "Unknown scalar type to convert"); 400 // Compare against an integer or pointer null. 401 llvm::Constant *Zero = llvm::Constant::getNullValue(SubExpr->getType()); 402 SubExpr = llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_EQ, SubExpr, 403 Zero); 404 } 405 406 return llvm::ConstantExpr::getZExt(SubExpr, ConvertType(E->getType())); 407 } 408 llvm::Constant *VisitUnarySizeOf(const UnaryOperator *E) { 409 return EmitSizeAlignOf(E->getSubExpr()->getType(), E->getType(), true); 410 } 411 llvm::Constant *VisitUnaryAlignOf(const UnaryOperator *E) { 412 return EmitSizeAlignOf(E->getSubExpr()->getType(), E->getType(), false); 413 } 414 llvm::Constant *VisitUnaryAddrOf(const UnaryOperator *E) { 415 return EmitLValue(E->getSubExpr()); 416 } 417 llvm::Constant *VisitUnaryOffsetOf(const UnaryOperator *E) { 418 int64_t Val = E->evaluateOffsetOf(CGM.getContext()); 419 420 assert(E->getType()->isIntegerType() && "Result type must be an integer!"); 421 422 uint32_t ResultWidth = 423 static_cast<uint32_t>(CGM.getContext().getTypeSize(E->getType())); 424 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 425 } 426 427 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) { 428 return Visit(E->getSubExpr()); 429 } 430 431 // Binary operators 432 llvm::Constant *VisitBinOr(const BinaryOperator *E) { 433 llvm::Constant *LHS = Visit(E->getLHS()); 434 llvm::Constant *RHS = Visit(E->getRHS()); 435 436 return llvm::ConstantExpr::getOr(LHS, RHS); 437 } 438 llvm::Constant *VisitBinSub(const BinaryOperator *E) { 439 llvm::Constant *LHS = Visit(E->getLHS()); 440 llvm::Constant *RHS = Visit(E->getRHS()); 441 442 if (!isa<llvm::PointerType>(RHS->getType())) { 443 // pointer - int 444 if (isa<llvm::PointerType>(LHS->getType())) { 445 llvm::Constant *Idx = llvm::ConstantExpr::getNeg(RHS); 446 447 return llvm::ConstantExpr::getGetElementPtr(LHS, &Idx, 1); 448 } 449 450 // int - int 451 return llvm::ConstantExpr::getSub(LHS, RHS); 452 } 453 454 assert(isa<llvm::PointerType>(LHS->getType())); 455 456 const llvm::Type *ResultType = ConvertType(E->getType()); 457 const QualType Type = E->getLHS()->getType(); 458 const QualType ElementType = Type->getAsPointerType()->getPointeeType(); 459 460 LHS = llvm::ConstantExpr::getPtrToInt(LHS, ResultType); 461 RHS = llvm::ConstantExpr::getPtrToInt(RHS, ResultType); 462 463 llvm::Constant *sub = llvm::ConstantExpr::getSub(LHS, RHS); 464 llvm::Constant *size = EmitSizeAlignOf(ElementType, E->getType(), true); 465 return llvm::ConstantExpr::getSDiv(sub, size); 466 } 467 468 llvm::Constant *VisitBinShl(const BinaryOperator *E) { 469 llvm::Constant *LHS = Visit(E->getLHS()); 470 llvm::Constant *RHS = Visit(E->getRHS()); 471 472 // LLVM requires the LHS and RHS to be the same type: promote or truncate the 473 // RHS to the same size as the LHS. 474 if (LHS->getType() != RHS->getType()) 475 RHS = llvm::ConstantExpr::getIntegerCast(RHS, LHS->getType(), false); 476 477 return llvm::ConstantExpr::getShl(LHS, RHS); 478 } 479 480 llvm::Constant *VisitBinMul(const BinaryOperator *E) { 481 llvm::Constant *LHS = Visit(E->getLHS()); 482 llvm::Constant *RHS = Visit(E->getRHS()); 483 484 return llvm::ConstantExpr::getMul(LHS, RHS); 485 } 486 487 llvm::Constant *VisitBinDiv(const BinaryOperator *E) { 488 llvm::Constant *LHS = Visit(E->getLHS()); 489 llvm::Constant *RHS = Visit(E->getRHS()); 490 491 if (LHS->getType()->isFPOrFPVector()) 492 return llvm::ConstantExpr::getFDiv(LHS, RHS); 493 else if (E->getType()->isUnsignedIntegerType()) 494 return llvm::ConstantExpr::getUDiv(LHS, RHS); 495 else 496 return llvm::ConstantExpr::getSDiv(LHS, RHS); 497 } 498 499 llvm::Constant *VisitBinAdd(const BinaryOperator *E) { 500 llvm::Constant *LHS = Visit(E->getLHS()); 501 llvm::Constant *RHS = Visit(E->getRHS()); 502 503 if (!E->getType()->isPointerType()) 504 return llvm::ConstantExpr::getAdd(LHS, RHS); 505 506 llvm::Constant *Ptr, *Idx; 507 if (isa<llvm::PointerType>(LHS->getType())) { // pointer + int 508 Ptr = LHS; 509 Idx = RHS; 510 } else { // int + pointer 511 Ptr = RHS; 512 Idx = LHS; 513 } 514 515 return llvm::ConstantExpr::getGetElementPtr(Ptr, &Idx, 1); 516 } 517 518 llvm::Constant *VisitBinAnd(const BinaryOperator *E) { 519 llvm::Constant *LHS = Visit(E->getLHS()); 520 llvm::Constant *RHS = Visit(E->getRHS()); 521 522 return llvm::ConstantExpr::getAnd(LHS, RHS); 523 } 524 525 llvm::Constant *EmitCmp(const BinaryOperator *E, 526 llvm::CmpInst::Predicate SignedPred, 527 llvm::CmpInst::Predicate UnsignedPred, 528 llvm::CmpInst::Predicate FloatPred) { 529 llvm::Constant *LHS = Visit(E->getLHS()); 530 llvm::Constant *RHS = Visit(E->getRHS()); 531 llvm::Constant *Result; 532 if (LHS->getType()->isInteger() || 533 isa<llvm::PointerType>(LHS->getType())) { 534 if (E->getLHS()->getType()->isSignedIntegerType()) 535 Result = llvm::ConstantExpr::getICmp(SignedPred, LHS, RHS); 536 else 537 Result = llvm::ConstantExpr::getICmp(UnsignedPred, LHS, RHS); 538 } else if (LHS->getType()->isFloatingPoint()) { 539 Result = llvm::ConstantExpr::getFCmp(FloatPred, LHS, RHS); 540 } else { 541 CGM.WarnUnsupported(E, "constant expression"); 542 Result = llvm::ConstantInt::getFalse(); 543 } 544 545 const llvm::Type* ResultType = ConvertType(E->getType()); 546 return llvm::ConstantExpr::getZExtOrBitCast(Result, ResultType); 547 } 548 549 llvm::Constant *VisitBinNE(const BinaryOperator *E) { 550 return EmitCmp(E, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_NE, 551 llvm::CmpInst::FCMP_ONE); 552 } 553 554 llvm::Constant *VisitBinEQ(const BinaryOperator *E) { 555 return EmitCmp(E, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_EQ, 556 llvm::CmpInst::FCMP_OEQ); 557 } 558 559 llvm::Constant *VisitBinLT(const BinaryOperator *E) { 560 return EmitCmp(E, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_ULT, 561 llvm::CmpInst::FCMP_OLT); 562 } 563 564 llvm::Constant *VisitBinLE(const BinaryOperator *E) { 565 return EmitCmp(E, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_ULE, 566 llvm::CmpInst::FCMP_OLE); 567 } 568 569 llvm::Constant *VisitBinGT(const BinaryOperator *E) { 570 return EmitCmp(E, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_UGT, 571 llvm::CmpInst::FCMP_OGT); 572 } 573 574 llvm::Constant *VisitBinGE(const BinaryOperator *E) { 575 return EmitCmp(E, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGE, 576 llvm::CmpInst::FCMP_OGE); 577 } 578 579 llvm::Constant *VisitConditionalOperator(const ConditionalOperator *E) { 580 llvm::Constant *Cond = Visit(E->getCond()); 581 llvm::Constant *CondVal = EmitConversionToBool(Cond, E->getType()); 582 llvm::ConstantInt *CondValInt = dyn_cast<llvm::ConstantInt>(CondVal); 583 if (!CondValInt) { 584 CGM.WarnUnsupported(E, "constant expression"); 585 return llvm::Constant::getNullValue(ConvertType(E->getType())); 586 } 587 if (CondValInt->isOne()) { 588 if (E->getLHS()) 589 return Visit(E->getLHS()); 590 return Cond; 591 } 592 593 return Visit(E->getRHS()); 594 } 595 596 // Utility methods 597 const llvm::Type *ConvertType(QualType T) { 598 return CGM.getTypes().ConvertType(T); 599 } 600 601 llvm::Constant *EmitConversionToBool(llvm::Constant *Src, QualType SrcType) { 602 assert(SrcType->isCanonical() && "EmitConversion strips typedefs"); 603 604 if (SrcType->isRealFloatingType()) { 605 // Compare against 0.0 for fp scalars. 606 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 607 return llvm::ConstantExpr::getFCmp(llvm::FCmpInst::FCMP_UNE, Src, Zero); 608 } 609 610 assert((SrcType->isIntegerType() || SrcType->isPointerType()) && 611 "Unknown scalar type to convert"); 612 613 // Compare against an integer or pointer null. 614 llvm::Constant *Zero = llvm::Constant::getNullValue(Src->getType()); 615 return llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_NE, Src, Zero); 616 } 617 618 llvm::Constant *EmitConversion(llvm::Constant *Src, QualType SrcType, 619 QualType DstType) { 620 SrcType = CGM.getContext().getCanonicalType(SrcType); 621 DstType = CGM.getContext().getCanonicalType(DstType); 622 if (SrcType == DstType) return Src; 623 624 // Handle conversions to bool first, they are special: comparisons against 0. 625 if (DstType->isBooleanType()) 626 return EmitConversionToBool(Src, SrcType); 627 628 const llvm::Type *DstTy = ConvertType(DstType); 629 630 // Ignore conversions like int -> uint. 631 if (Src->getType() == DstTy) 632 return Src; 633 634 // Handle pointer conversions next: pointers can only be converted to/from 635 // other pointers and integers. 636 if (isa<llvm::PointerType>(DstTy)) { 637 // The source value may be an integer, or a pointer. 638 if (isa<llvm::PointerType>(Src->getType())) 639 return llvm::ConstantExpr::getBitCast(Src, DstTy); 640 assert(SrcType->isIntegerType() &&"Not ptr->ptr or int->ptr conversion?"); 641 return llvm::ConstantExpr::getIntToPtr(Src, DstTy); 642 } 643 644 if (isa<llvm::PointerType>(Src->getType())) { 645 // Must be an ptr to int cast. 646 assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?"); 647 return llvm::ConstantExpr::getPtrToInt(Src, DstTy); 648 } 649 650 // A scalar source can be splatted to a vector of the same element type 651 if (isa<llvm::VectorType>(DstTy) && !isa<VectorType>(SrcType)) { 652 const llvm::VectorType *VT = cast<llvm::VectorType>(DstTy); 653 assert((VT->getElementType() == Src->getType()) && 654 "Vector element type must match scalar type to splat."); 655 unsigned NumElements = DstType->getAsVectorType()->getNumElements(); 656 llvm::SmallVector<llvm::Constant*, 16> Elements; 657 for (unsigned i = 0; i < NumElements; i++) 658 Elements.push_back(Src); 659 660 return llvm::ConstantVector::get(&Elements[0], NumElements); 661 } 662 663 if (isa<llvm::VectorType>(Src->getType()) || 664 isa<llvm::VectorType>(DstTy)) { 665 return llvm::ConstantExpr::getBitCast(Src, DstTy); 666 } 667 668 // Finally, we have the arithmetic types: real int/float. 669 if (isa<llvm::IntegerType>(Src->getType())) { 670 bool InputSigned = SrcType->isSignedIntegerType(); 671 if (isa<llvm::IntegerType>(DstTy)) 672 return llvm::ConstantExpr::getIntegerCast(Src, DstTy, InputSigned); 673 else if (InputSigned) 674 return llvm::ConstantExpr::getSIToFP(Src, DstTy); 675 else 676 return llvm::ConstantExpr::getUIToFP(Src, DstTy); 677 } 678 679 assert(Src->getType()->isFloatingPoint() && "Unknown real conversion"); 680 if (isa<llvm::IntegerType>(DstTy)) { 681 if (DstType->isSignedIntegerType()) 682 return llvm::ConstantExpr::getFPToSI(Src, DstTy); 683 else 684 return llvm::ConstantExpr::getFPToUI(Src, DstTy); 685 } 686 687 assert(DstTy->isFloatingPoint() && "Unknown real conversion"); 688 if (DstTy->getTypeID() < Src->getType()->getTypeID()) 689 return llvm::ConstantExpr::getFPTrunc(Src, DstTy); 690 else 691 return llvm::ConstantExpr::getFPExtend(Src, DstTy); 692 } 693 694 llvm::Constant *EmitSizeAlignOf(QualType TypeToSize, 695 QualType RetType, bool isSizeOf) { 696 std::pair<uint64_t, unsigned> Info = 697 CGM.getContext().getTypeInfo(TypeToSize); 698 699 uint64_t Val = isSizeOf ? Info.first : Info.second; 700 Val /= 8; // Return size in bytes, not bits. 701 702 assert(RetType->isIntegerType() && "Result type must be an integer!"); 703 704 uint32_t ResultWidth = 705 static_cast<uint32_t>(CGM.getContext().getTypeSize(RetType)); 706 return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); 707 } 708 709 llvm::Constant *EmitLValue(Expr *E) { 710 switch (E->getStmtClass()) { 711 default: break; 712 case Expr::ParenExprClass: 713 // Elide parenthesis 714 return EmitLValue(cast<ParenExpr>(E)->getSubExpr()); 715 case Expr::CompoundLiteralExprClass: { 716 // Note that due to the nature of compound literals, this is guaranteed 717 // to be the only use of the variable, so we just generate it here. 718 CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E); 719 llvm::Constant* C = Visit(CLE->getInitializer()); 720 C = new llvm::GlobalVariable(C->getType(),E->getType().isConstQualified(), 721 llvm::GlobalValue::InternalLinkage, 722 C, ".compoundliteral", &CGM.getModule()); 723 return C; 724 } 725 case Expr::DeclRefExprClass: { 726 ValueDecl *Decl = cast<DeclRefExpr>(E)->getDecl(); 727 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl)) 728 return CGM.GetAddrOfFunction(FD); 729 if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) { 730 if (VD->isFileVarDecl()) 731 return CGM.GetAddrOfGlobalVar(VD); 732 else if (VD->isBlockVarDecl()) { 733 assert(CGF && "Can't access static local vars without CGF"); 734 return CGF->GetAddrOfStaticLocalVar(VD); 735 } 736 } 737 break; 738 } 739 case Expr::MemberExprClass: { 740 MemberExpr* ME = cast<MemberExpr>(E); 741 llvm::Constant *Base; 742 if (ME->isArrow()) 743 Base = Visit(ME->getBase()); 744 else 745 Base = EmitLValue(ME->getBase()); 746 747 unsigned FieldNumber = CGM.getTypes().getLLVMFieldNo(ME->getMemberDecl()); 748 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 749 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 750 FieldNumber); 751 llvm::Value *Ops[] = {Zero, Idx}; 752 return llvm::ConstantExpr::getGetElementPtr(Base, Ops, 2); 753 } 754 case Expr::ArraySubscriptExprClass: { 755 ArraySubscriptExpr* ASExpr = cast<ArraySubscriptExpr>(E); 756 llvm::Constant *Base = Visit(ASExpr->getBase()); 757 llvm::Constant *Index = Visit(ASExpr->getIdx()); 758 assert(!ASExpr->getBase()->getType()->isVectorType() && 759 "Taking the address of a vector component is illegal!"); 760 return llvm::ConstantExpr::getGetElementPtr(Base, &Index, 1); 761 } 762 case Expr::StringLiteralClass: { 763 StringLiteral *S = cast<StringLiteral>(E); 764 return CGM.GetAddrOfConstantString(CGM.getStringForStringLiteral(S)); 765 } 766 case Expr::UnaryOperatorClass: { 767 UnaryOperator *Exp = cast<UnaryOperator>(E); 768 switch (Exp->getOpcode()) { 769 default: break; 770 case UnaryOperator::Extension: 771 // Extension is just a wrapper for expressions 772 return EmitLValue(Exp->getSubExpr()); 773 case UnaryOperator::Real: 774 case UnaryOperator::Imag: { 775 // The address of __real or __imag is just a GEP off the address 776 // of the internal expression 777 llvm::Constant* C = EmitLValue(Exp->getSubExpr()); 778 llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0); 779 llvm::Constant *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, 780 Exp->getOpcode() == UnaryOperator::Imag); 781 llvm::Value *Ops[] = {Zero, Idx}; 782 return llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); 783 } 784 case UnaryOperator::Deref: 785 // The address of a deref is just the value of the expression 786 return Visit(Exp->getSubExpr()); 787 } 788 break; 789 } 790 } 791 CGM.WarnUnsupported(E, "constant l-value expression"); 792 llvm::Type *Ty = llvm::PointerType::getUnqual(ConvertType(E->getType())); 793 return llvm::UndefValue::get(Ty); 794 } 795 796 }; 797 798 } // end anonymous namespace. 799 800 801 llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, 802 CodeGenFunction *CGF) { 803 QualType type = Context.getCanonicalType(E->getType()); 804 805 if (type->isIntegerType()) { 806 llvm::APSInt Value(static_cast<uint32_t>(Context.getTypeSize(type))); 807 if (E->isIntegerConstantExpr(Value, Context)) { 808 return llvm::ConstantInt::get(Value); 809 } 810 } 811 812 llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E)); 813 if (C->getType() == llvm::Type::Int1Ty) { 814 const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); 815 C = llvm::ConstantExpr::getZExt(C, BoolTy); 816 } 817 return C; 818 } 819