CodeGenFunction.h revision 17d28a3e0b0efaba14534d0e6d6a307283d96b9f
1//===-- CodeGenFunction.h - Per-Function state for LLVM CodeGen -*- C++ -*-===// 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 is the internal per-function state used for llvm translation. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef CLANG_CODEGEN_CODEGENFUNCTION_H 15#define CLANG_CODEGEN_CODEGENFUNCTION_H 16 17#include "clang/AST/Type.h" 18#include "llvm/ADT/DenseMap.h" 19#include "llvm/ADT/SmallVector.h" 20#include "clang/AST/Expr.h" 21#include "clang/AST/ExprCXX.h" 22#include "clang/AST/ExprObjC.h" 23 24#include <vector> 25#include <map> 26 27#include "CGBuilder.h" 28#include "CGCall.h" 29#include "CGValue.h" 30 31namespace llvm { 32 class BasicBlock; 33 class Module; 34 class SwitchInst; 35 class Value; 36} 37 38namespace clang { 39 class ASTContext; 40 class Decl; 41 class EnumConstantDecl; 42 class FunctionDecl; 43 class FunctionTypeProto; 44 class LabelStmt; 45 class ObjCInterfaceDecl; 46 class ObjCIvarDecl; 47 class ObjCMethodDecl; 48 class ObjCImplementationDecl; 49 class ObjCPropertyImplDecl; 50 class TargetInfo; 51 class VarDecl; 52 53namespace CodeGen { 54 class CodeGenModule; 55 class CodeGenTypes; 56 class CGRecordLayout; 57 58/// CodeGenFunction - This class organizes the per-function state that is used 59/// while generating LLVM code. 60class CodeGenFunction { 61public: 62 CodeGenModule &CGM; // Per-module state. 63 TargetInfo &Target; 64 65 typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy; 66 CGBuilderTy Builder; 67 68 // Holds the Decl for the current function or method 69 const Decl *CurFuncDecl; 70 QualType FnRetTy; 71 llvm::Function *CurFn; 72 73 /// ReturnBlock - Unified return block. 74 llvm::BasicBlock *ReturnBlock; 75 /// ReturnValue - The temporary alloca to hold the return value. This 76 /// is null iff the function has no return value. 77 llvm::Instruction *ReturnValue; 78 79 /// AllocaInsertPoint - This is an instruction in the entry block before which 80 /// we prefer to insert allocas. 81 llvm::Instruction *AllocaInsertPt; 82 83 const llvm::Type *LLVMIntTy; 84 uint32_t LLVMPointerWidth; 85 86public: 87 // FIXME: The following should be private once EH code is moved out 88 // of NeXT runtime. 89 90 // ObjCEHStack - This keeps track of which object to rethrow from 91 // inside @catch blocks and which @finally block exits from an EH 92 // scope should be chained through. 93 struct ObjCEHEntry { 94 ObjCEHEntry(llvm::BasicBlock *fb, llvm::BasicBlock *fne, 95 llvm::SwitchInst *fs, llvm::Value *dc) 96 : FinallyBlock(fb), FinallyNoExit(fne), FinallySwitch(fs), 97 DestCode(dc), Exception(0) {} 98 99 /// Entry point to the finally block. 100 llvm::BasicBlock *FinallyBlock; 101 102 /// Entry point to the finally block which skips execution of the 103 /// try_exit runtime function. 104 llvm::BasicBlock *FinallyNoExit; 105 106 /// Switch instruction which runs at the end of the finally block 107 /// to forward jumps through the finally block. 108 llvm::SwitchInst *FinallySwitch; 109 110 /// Variable holding the code for the destination of a jump 111 /// through the @finally block. 112 llvm::Value *DestCode; 113 114 /// The exception object being handled, during IR generation for a 115 /// @catch block. 116 llvm::Value *Exception; 117 }; 118 119 typedef llvm::SmallVector<ObjCEHEntry*, 8> ObjCEHStackType; 120 ObjCEHStackType ObjCEHStack; 121 122 /// EmitJumpThroughFinally - Emit a branch from the current insert 123 /// point through the finally handling code for \arg Entry and then 124 /// on to \arg Dest. It is legal to call this function even if there 125 /// is no current insertion point. 126 /// 127 /// \param ExecuteTryExit - When true, the try_exit runtime function 128 /// should be called prior to executing the finally code. 129 void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest, 130 bool ExecuteTryExit=true); 131 132private: 133 /// LabelIDs - Track arbitrary ids assigned to labels for use in 134 /// implementing the GCC address-of-label extension and indirect 135 /// goto. IDs are assigned to labels inside getIDForAddrOfLabel(). 136 std::map<const LabelStmt*, unsigned> LabelIDs; 137 138 /// IndirectSwitches - Record the list of switches for indirect 139 /// gotos. Emission of the actual switching code needs to be delayed 140 /// until all AddrLabelExprs have been seen. 141 std::vector<llvm::SwitchInst*> IndirectSwitches; 142 143 /// LocalDeclMap - This keeps track of the LLVM allocas or globals for local C 144 /// decls. 145 llvm::DenseMap<const Decl*, llvm::Value*> LocalDeclMap; 146 147 /// LabelMap - This keeps track of the LLVM basic block for each C label. 148 llvm::DenseMap<const LabelStmt*, llvm::BasicBlock*> LabelMap; 149 150 // BreakContinueStack - This keeps track of where break and continue 151 // statements should jump to. 152 struct BreakContinue { 153 BreakContinue(llvm::BasicBlock *bb, llvm::BasicBlock *cb) 154 : BreakBlock(bb), ContinueBlock(cb) {} 155 156 llvm::BasicBlock *BreakBlock; 157 llvm::BasicBlock *ContinueBlock; 158 }; 159 llvm::SmallVector<BreakContinue, 8> BreakContinueStack; 160 161 /// SwitchInsn - This is nearest current switch instruction. It is null if 162 /// if current context is not in a switch. 163 llvm::SwitchInst *SwitchInsn; 164 165 /// CaseRangeBlock - This block holds if condition check for last case 166 /// statement range in current switch instruction. 167 llvm::BasicBlock *CaseRangeBlock; 168 169 /// StackSaveValues - A stack(!) of stack save values. When a new scope is 170 /// entered, a null is pushed on this stack. If a VLA is emitted, then 171 /// the return value of llvm.stacksave() is stored at the top of this stack. 172 llvm::SmallVector<llvm::Value*, 8> StackSaveValues; 173 174public: 175 CodeGenFunction(CodeGenModule &cgm); 176 177 ASTContext &getContext() const; 178 179 void GenerateObjCMethod(const ObjCMethodDecl *OMD); 180 181 void StartObjCMethod(const ObjCMethodDecl *MD); 182 183 /// GenerateObjCGetter - Synthesize an Objective-C property getter 184 /// function. 185 void GenerateObjCGetter(ObjCImplementationDecl *IMP, 186 const ObjCPropertyImplDecl *PID); 187 188 /// GenerateObjCSetter - Synthesize an Objective-C property setter 189 /// function for the given property. 190 void GenerateObjCSetter(ObjCImplementationDecl *IMP, 191 const ObjCPropertyImplDecl *PID); 192 193 void GenerateCode(const FunctionDecl *FD, 194 llvm::Function *Fn); 195 void StartFunction(const Decl *D, QualType RetTy, 196 llvm::Function *Fn, 197 const FunctionArgList &Args, 198 SourceLocation StartLoc); 199 200 /// FinishFunction - Complete IR generation of the current 201 /// function. It is legal to call this function even if there is no 202 /// current insertion point. 203 void FinishFunction(SourceLocation EndLoc=SourceLocation()); 204 205 /// EmitFunctionProlog - Emit the target specific LLVM code to load 206 /// the arguments for the given function. This is also responsible 207 /// for naming the LLVM function arguments. 208 void EmitFunctionProlog(llvm::Function *Fn, QualType RetTy, 209 const FunctionArgList &Args); 210 211 /// EmitFunctionEpilog - Emit the target specific LLVM code to 212 /// return the given temporary. 213 void EmitFunctionEpilog(QualType RetTy, 214 llvm::Value *ReturnValue); 215 216 const llvm::Type *ConvertType(QualType T); 217 218 /// LoadObjCSelf - Load the value of self. This function is only 219 /// valid while generating code for an Objective-C method. 220 llvm::Value *LoadObjCSelf(); 221 222 /// isObjCPointerType - Return true if the specificed AST type will map onto 223 /// some Objective-C pointer type. 224 static bool isObjCPointerType(QualType T); 225 226 /// hasAggregateLLVMType - Return true if the specified AST type will map into 227 /// an aggregate LLVM type or is void. 228 static bool hasAggregateLLVMType(QualType T); 229 230 /// createBasicBlock - Create an LLVM basic block. 231 llvm::BasicBlock *createBasicBlock(const char *Name="", 232 llvm::Function *Parent=0, 233 llvm::BasicBlock *InsertBefore=0) { 234#ifdef NDEBUG 235 return llvm::BasicBlock::Create("", Parent, InsertBefore); 236#else 237 return llvm::BasicBlock::Create(Name, Parent, InsertBefore); 238#endif 239 } 240 241 /// getBasicBlockForLabel - Return the LLVM basicblock that the specified 242 /// label maps to. 243 llvm::BasicBlock *getBasicBlockForLabel(const LabelStmt *S); 244 245 /// EmitBlock - Emit the given block \arg BB and set it as the 246 /// insert point, adding a fall-through branch from the current 247 /// insert block if necessary. It is legal to call this function 248 /// even if there is no current insertion point. 249 /// 250 /// IsFinished - If true, indicates that the caller has finished 251 /// emitting branches to the given block and does not expect to emit 252 /// code into it. This means the block can be ignored if it is 253 /// unreachable. 254 void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false); 255 256 /// EmitBranch - Emit a branch to the specified basic block from the 257 /// current insert block, taking care to avoid creation of branches 258 /// from dummy blocks. It is legal to call this function even if 259 /// there is no current insertion point. 260 /// 261 /// This function clears the current insertion point. The caller 262 /// should follow calls to this function with calls to Emit*Block 263 /// prior to generation new code. 264 void EmitBranch(llvm::BasicBlock *Block); 265 266 /// HaveInsertPoint - True if an insertion point is defined. If not, 267 /// this indicates that the current code being emitted is 268 /// unreachable. 269 bool HaveInsertPoint() const { 270 return Builder.GetInsertBlock() != 0; 271 } 272 273 /// EnsureInsertPoint - Ensure that an insertion point is defined so 274 /// that emitted IR has a place to go. Note that by definition, if 275 /// this function creates a block then that block is unreachable; 276 /// callers may do better to detect when no insertion point is 277 /// defined and simply skip IR generation. 278 void EnsureInsertPoint() { 279 if (!HaveInsertPoint()) 280 EmitBlock(createBasicBlock()); 281 } 282 283 /// ErrorUnsupported - Print out an error that codegen doesn't support the 284 /// specified stmt yet. 285 void ErrorUnsupported(const Stmt *S, const char *Type, 286 bool OmitOnError=false); 287 288 //===--------------------------------------------------------------------===// 289 // Helpers 290 //===--------------------------------------------------------------------===// 291 292 /// CreateTempAlloca - This creates a alloca and inserts it into the entry 293 /// block. 294 llvm::AllocaInst *CreateTempAlloca(const llvm::Type *Ty, 295 const char *Name = "tmp"); 296 297 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified 298 /// expression and compare the result against zero, returning an Int1Ty value. 299 llvm::Value *EvaluateExprAsBool(const Expr *E); 300 301 /// EmitAnyExpr - Emit code to compute the specified expression which can have 302 /// any type. The result is returned as an RValue struct. If this is an 303 /// aggregate expression, the aggloc/agglocvolatile arguments indicate where 304 /// the result should be returned. 305 RValue EmitAnyExpr(const Expr *E, llvm::Value *AggLoc = 0, 306 bool isAggLocVolatile = false); 307 308 /// EmitAnyExprToTemp - Similary to EmitAnyExpr(), however, the result 309 /// will always be accessible even if no aggregate location is 310 /// provided. 311 RValue EmitAnyExprToTemp(const Expr *E, llvm::Value *AggLoc = 0, 312 bool isAggLocVolatile = false); 313 314 void EmitAggregateCopy(llvm::Value *DestPtr, llvm::Value *SrcPtr, 315 QualType EltTy); 316 317 void EmitAggregateClear(llvm::Value *DestPtr, QualType Ty); 318 319 /// StartBlock - Start new block named N. If insert block is a dummy block 320 /// then reuse it. 321 void StartBlock(const char *N); 322 323 /// getCGRecordLayout - Return record layout info. 324 const CGRecordLayout *getCGRecordLayout(CodeGenTypes &CGT, QualType RTy); 325 326 /// GetAddrOfStaticLocalVar - Return the address of a static local variable. 327 llvm::Constant *GetAddrOfStaticLocalVar(const VarDecl *BVD); 328 329 /// GetAddrOfLocalVar - Return the address of a local variable. 330 llvm::Value *GetAddrOfLocalVar(const VarDecl *VD); 331 332 /// getAccessedFieldNo - Given an encoded value and a result number, return 333 /// the input field number being accessed. 334 static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts); 335 336 unsigned GetIDForAddrOfLabel(const LabelStmt *L); 337 338 /// EmitMemSetToZero - Generate code to memset a value of the given type to 0; 339 void EmitMemSetToZero(llvm::Value *DestPtr, QualType Ty); 340 341 // EmitVAArg - Generate code to get an argument from the passed in pointer 342 // and update it accordingly. The return value is a pointer to the argument. 343 // FIXME: We should be able to get rid of this method and use the va_arg 344 // instruction in LLVM instead once it works well enough. 345 llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty); 346 347 //===--------------------------------------------------------------------===// 348 // Declaration Emission 349 //===--------------------------------------------------------------------===// 350 351 void EmitDecl(const Decl &D); 352 void EmitBlockVarDecl(const VarDecl &D); 353 void EmitLocalBlockVarDecl(const VarDecl &D); 354 void EmitStaticBlockVarDecl(const VarDecl &D); 355 356 /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl. 357 void EmitParmDecl(const VarDecl &D, llvm::Value *Arg); 358 359 //===--------------------------------------------------------------------===// 360 // Statement Emission 361 //===--------------------------------------------------------------------===// 362 363 /// EmitStopPoint - Emit a debug stoppoint if we are emitting debug 364 /// info. 365 void EmitStopPoint(const Stmt *S); 366 367 /// EmitStmt - Emit the code for the statement \arg S. It is legal 368 /// to call this function even if there is no current insertion 369 /// point. 370 /// 371 /// This function may clear the current insertion point; callers 372 /// should use EnsureInsertPoint if they wish to subsequently 373 /// generate code without first calling EmitBlock, EmitBranch, or 374 /// EmitStmt. 375 void EmitStmt(const Stmt *S); 376 377 /// EmitSimpleStmt - Try to emit a "simple" statement which does not 378 /// necessarily require an insertion point or debug information; 379 /// typically because the statement amounts to a jump or a container 380 /// of other statements. 381 /// 382 /// \return True if the statement was handled. 383 bool EmitSimpleStmt(const Stmt *S); 384 385 RValue EmitCompoundStmt(const CompoundStmt &S, bool GetLast = false, 386 llvm::Value *AggLoc = 0, bool isAggVol = false); 387 388 /// EmitLabel - Emit the block for the given label. It is legal 389 /// to call this function even if there is no current insertion 390 /// point. 391 void EmitLabel(const LabelStmt &S); // helper for EmitLabelStmt. 392 393 void EmitLabelStmt(const LabelStmt &S); 394 void EmitGotoStmt(const GotoStmt &S); 395 void EmitIndirectGotoStmt(const IndirectGotoStmt &S); 396 void EmitIfStmt(const IfStmt &S); 397 void EmitWhileStmt(const WhileStmt &S); 398 void EmitDoStmt(const DoStmt &S); 399 void EmitForStmt(const ForStmt &S); 400 void EmitReturnStmt(const ReturnStmt &S); 401 void EmitDeclStmt(const DeclStmt &S); 402 void EmitBreakStmt(const BreakStmt &S); 403 void EmitContinueStmt(const ContinueStmt &S); 404 void EmitSwitchStmt(const SwitchStmt &S); 405 void EmitDefaultStmt(const DefaultStmt &S); 406 void EmitCaseStmt(const CaseStmt &S); 407 void EmitCaseStmtRange(const CaseStmt &S); 408 void EmitAsmStmt(const AsmStmt &S); 409 410 void EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S); 411 void EmitObjCAtTryStmt(const ObjCAtTryStmt &S); 412 void EmitObjCAtThrowStmt(const ObjCAtThrowStmt &S); 413 void EmitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt &S); 414 415 //===--------------------------------------------------------------------===// 416 // LValue Expression Emission 417 //===--------------------------------------------------------------------===// 418 419 /// EmitUnsupportedLValue - Emit a dummy l-value using the type of E 420 /// and issue an ErrorUnsupported style diagnostic (using the 421 /// provided Name). 422 LValue EmitUnsupportedLValue(const Expr *E, 423 const char *Name); 424 425 /// EmitLValue - Emit code to compute a designator that specifies the location 426 /// of the expression. 427 /// 428 /// This can return one of two things: a simple address or a bitfield 429 /// reference. In either case, the LLVM Value* in the LValue structure is 430 /// guaranteed to be an LLVM pointer type. 431 /// 432 /// If this returns a bitfield reference, nothing about the pointee type of 433 /// the LLVM value is known: For example, it may not be a pointer to an 434 /// integer. 435 /// 436 /// If this returns a normal address, and if the lvalue's C type is fixed 437 /// size, this method guarantees that the returned pointer type will point to 438 /// an LLVM type of the same size of the lvalue's type. If the lvalue has a 439 /// variable length type, this is not possible. 440 /// 441 LValue EmitLValue(const Expr *E); 442 443 /// EmitLoadOfLValue - Given an expression that represents a value lvalue, 444 /// this method emits the address of the lvalue, then loads the result as an 445 /// rvalue, returning the rvalue. 446 RValue EmitLoadOfLValue(LValue V, QualType LVType); 447 RValue EmitLoadOfExtVectorElementLValue(LValue V, QualType LVType); 448 RValue EmitLoadOfBitfieldLValue(LValue LV, QualType ExprType); 449 RValue EmitLoadOfPropertyRefLValue(LValue LV, QualType ExprType); 450 RValue EmitLoadOfKVCRefLValue(LValue LV, QualType ExprType); 451 452 453 /// EmitStoreThroughLValue - Store the specified rvalue into the specified 454 /// lvalue, where both are guaranteed to the have the same type, and that type 455 /// is 'Ty'. 456 void EmitStoreThroughLValue(RValue Src, LValue Dst, QualType Ty); 457 void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst, 458 QualType Ty); 459 void EmitStoreThroughPropertyRefLValue(RValue Src, LValue Dst, QualType Ty); 460 void EmitStoreThroughKVCRefLValue(RValue Src, LValue Dst, QualType Ty); 461 462 /// EmitStoreThroughLValue - Store Src into Dst with same 463 /// constraints as EmitStoreThroughLValue. 464 /// 465 /// \param Result [out] - If non-null, this will be set to a Value* 466 /// for the bit-field contents after the store, appropriate for use 467 /// as the result of an assignment to the bit-field. 468 void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, QualType Ty, 469 llvm::Value **Result=0); 470 471 // Note: only availabe for agg return types 472 LValue EmitBinaryOperatorLValue(const BinaryOperator *E); 473 // Note: only availabe for agg return types 474 LValue EmitCallExprLValue(const CallExpr *E); 475 LValue EmitDeclRefLValue(const DeclRefExpr *E); 476 LValue EmitStringLiteralLValue(const StringLiteral *E); 477 LValue EmitPredefinedFunctionName(unsigned Type); 478 LValue EmitPredefinedLValue(const PredefinedExpr *E); 479 LValue EmitUnaryOpLValue(const UnaryOperator *E); 480 LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E); 481 LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E); 482 LValue EmitMemberExpr(const MemberExpr *E); 483 LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E); 484 485 llvm::Value *EmitIvarOffset(ObjCInterfaceDecl *Interface, 486 const ObjCIvarDecl *Ivar); 487 LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field, 488 bool isUnion, unsigned CVRQualifiers); 489 LValue EmitLValueForIvar(llvm::Value* Base, const ObjCIvarDecl *Ivar, 490 unsigned CVRQualifiers); 491 492 LValue EmitCXXConditionDeclLValue(const CXXConditionDeclExpr *E); 493 494 LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E); 495 LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E); 496 LValue EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E); 497 LValue EmitObjCKVCRefLValue(const ObjCKVCRefExpr *E); 498 LValue EmitObjCSuperExpr(const ObjCSuperExpr *E); 499 500 //===--------------------------------------------------------------------===// 501 // Scalar Expression Emission 502 //===--------------------------------------------------------------------===// 503 504 /// EmitCall - Generate a call of the given function, expecting the 505 /// given result type, and using the given argument list which 506 /// specifies both the LLVM arguments and the types they were 507 /// derived from. 508 RValue EmitCall(llvm::Value *Callee, 509 QualType ResultType, 510 const CallArgList &Args); 511 512 RValue EmitCallExpr(const CallExpr *E); 513 514 RValue EmitCallExpr(Expr *FnExpr, CallExpr::const_arg_iterator ArgBeg, 515 CallExpr::const_arg_iterator ArgEnd); 516 517 RValue EmitCallExpr(llvm::Value *Callee, QualType FnType, 518 CallExpr::const_arg_iterator ArgBeg, 519 CallExpr::const_arg_iterator ArgEnd); 520 521 RValue EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E); 522 523 /// EmitTargetBuiltinExpr - Emit the given builtin call. Returns 0 524 /// if the call is unhandled by the current target. 525 llvm::Value *EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E); 526 527 llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E); 528 llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E); 529 530 llvm::Value *EmitShuffleVector(llvm::Value* V1, llvm::Value *V2, ...); 531 llvm::Value *EmitVector(llvm::Value * const *Vals, unsigned NumVals, 532 bool isSplat = false); 533 534 llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E); 535 llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); 536 llvm::Value *EmitObjCSelectorExpr(const ObjCSelectorExpr *E); 537 RValue EmitObjCMessageExpr(const ObjCMessageExpr *E); 538 RValue EmitObjCPropertyGet(const Expr *E); 539 void EmitObjCPropertySet(const Expr *E, RValue Src); 540 541 542 //===--------------------------------------------------------------------===// 543 // Expression Emission 544 //===--------------------------------------------------------------------===// 545 546 // Expressions are broken into three classes: scalar, complex, aggregate. 547 548 /// EmitScalarExpr - Emit the computation of the specified expression of 549 /// LLVM scalar type, returning the result. 550 llvm::Value *EmitScalarExpr(const Expr *E); 551 552 /// EmitScalarConversion - Emit a conversion from the specified type to the 553 /// specified destination type, both of which are LLVM scalar types. 554 llvm::Value *EmitScalarConversion(llvm::Value *Src, QualType SrcTy, 555 QualType DstTy); 556 557 /// EmitComplexToScalarConversion - Emit a conversion from the specified 558 /// complex type to the specified destination type, where the destination 559 /// type is an LLVM scalar type. 560 llvm::Value *EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy, 561 QualType DstTy); 562 563 564 /// EmitAggExpr - Emit the computation of the specified expression of 565 /// aggregate type. The result is computed into DestPtr. Note that if 566 /// DestPtr is null, the value of the aggregate expression is not needed. 567 void EmitAggExpr(const Expr *E, llvm::Value *DestPtr, bool VolatileDest); 568 569 /// EmitComplexExpr - Emit the computation of the specified expression of 570 /// complex type, returning the result. 571 ComplexPairTy EmitComplexExpr(const Expr *E); 572 573 /// EmitComplexExprIntoAddr - Emit the computation of the specified expression 574 /// of complex type, storing into the specified Value*. 575 void EmitComplexExprIntoAddr(const Expr *E, llvm::Value *DestAddr, 576 bool DestIsVolatile); 577 578 /// StoreComplexToAddr - Store a complex number into the specified address. 579 void StoreComplexToAddr(ComplexPairTy V, llvm::Value *DestAddr, 580 bool DestIsVolatile); 581 /// LoadComplexFromAddr - Load a complex number from the specified address. 582 ComplexPairTy LoadComplexFromAddr(llvm::Value *SrcAddr, bool SrcIsVolatile); 583 584 /// GenerateStaticBlockVarDecl - return the the static 585 /// declaration of local variable. 586 llvm::GlobalValue *GenerateStaticBlockVarDecl(const VarDecl &D, 587 bool NoInit, 588 const char *Separator); 589 590 // GenerateStaticBlockVarDecl - return the static declaration of 591 // a local variable. Performs initialization of the variable if necessary. 592 llvm::GlobalValue *GenerateStaticCXXBlockVarDecl(const VarDecl &D); 593 594 //===--------------------------------------------------------------------===// 595 // Internal Helpers 596 //===--------------------------------------------------------------------===// 597 598 /// ContainsLabel - Return true if the statement contains a label in it. If 599 /// this statement is not executed normally, it not containing a label means 600 /// that we can just remove the code. 601 static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts = false); 602 603 /// ConstantFoldsToSimpleInteger - If the specified expression does not fold 604 /// to a constant, or if it does but contains a label, return 0. If it 605 /// constant folds to 'true' and does not contain a label, return 1, if it 606 /// constant folds to 'false' and does not contain a label, return -1. 607 int ConstantFoldsToSimpleInteger(const Expr *Cond); 608 609 /// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an 610 /// if statement) to the specified blocks. Based on the condition, this might 611 /// try to simplify the codegen of the conditional based on the branch. 612 /// 613 void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, 614 llvm::BasicBlock *FalseBlock); 615private: 616 617 /// EmitIndirectSwitches - Emit code for all of the switch 618 /// instructions in IndirectSwitches. 619 void EmitIndirectSwitches(); 620 621 void EmitReturnOfRValue(RValue RV, QualType Ty); 622 623 /// ExpandTypeFromArgs - Reconstruct a structure of type \arg Ty 624 /// from function arguments into \arg Dst. See ABIArgInfo::Expand. 625 /// 626 /// \param AI - The first function argument of the expansion. 627 /// \return The argument following the last expanded function 628 /// argument. 629 llvm::Function::arg_iterator 630 ExpandTypeFromArgs(QualType Ty, LValue Dst, 631 llvm::Function::arg_iterator AI); 632 633 /// ExpandTypeToArgs - Expand an RValue \arg Src, with the LLVM type 634 /// for \arg Ty, into individual arguments on the provided vector 635 /// \arg Args. See ABIArgInfo::Expand. 636 void ExpandTypeToArgs(QualType Ty, RValue Src, 637 llvm::SmallVector<llvm::Value*, 16> &Args); 638}; 639} // end namespace CodeGen 640} // end namespace clang 641 642#endif 643