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