Lines Matching refs:llvm

21 #include "llvm/ADT/DenseSet.h"
22 #include "llvm/ADT/SetVector.h"
23 #include "llvm/Support/Compiler.h"
24 #include "llvm/Support/Format.h"
25 #include "llvm/Transforms/Utils/Cloning.h"
35 llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
41 llvm::raw_svector_ostream Out(Name);
49 llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD);
55 const ThunkInfo &Thunk, llvm::Function *Fn) {
75 llvm::BasicBlock *AdjustNull = nullptr;
76 llvm::BasicBlock *AdjustNotNull = nullptr;
77 llvm::BasicBlock *AdjustEnd = nullptr;
79 llvm::Value *ReturnValue = RV.getScalarVal();
86 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ReturnValue);
100 llvm::PHINode *PHI = CGF.Builder.CreatePHI(ReturnValue->getType(), 2);
102 PHI->addIncoming(llvm::Constant::getNullValue(ReturnValue->getType()),
127 llvm::Function *Fn,
136 llvm::Type *Ty = CGM.getTypes().GetFunctionType(FnInfo);
137 llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
138 llvm::Function *BaseFn = cast<llvm::Function>(Callee);
141 llvm::ValueToValueMapTy VMap;
142 llvm::Function *NewFn = llvm::CloneFunction(BaseFn, VMap,
154 llvm::Function::arg_iterator AI = Fn->arg_begin();
160 llvm::Value *ThisPtr = &*AI;
161 llvm::BasicBlock *EntryBB = Fn->begin();
162 llvm::Instruction *ThisStore = nullptr;
163 for (llvm::BasicBlock::iterator I = EntryBB->begin(), E = EntryBB->end();
165 if (isa<llvm::StoreInst>(I) && I->getOperand(0) == ThisPtr) {
166 ThisStore = cast<llvm::StoreInst>(I);
173 llvm::Value *AdjustedThisPtr =
179 for (llvm::Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++) {
180 llvm::Instruction *T = I->getTerminator();
181 if (isa<llvm::ReturnInst>(T)) {
193 void CodeGenFunction::StartThunk(llvm::Function *Fn, GlobalDecl GD,
228 llvm::Value *Callee,
235 llvm::Value *AdjustedThisPtr = Thunk ? CGM.getCXXABI().performThisAdjustment(
298 void CodeGenFunction::GenerateThunk(llvm::Function *Fn,
304 llvm::Type *Ty =
306 llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
324 llvm::Constant *C = CGM.GetAddrOfThunk(GD, Thunk);
325 llvm::GlobalValue *Entry;
328 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(C)) {
329 assert(CE->getOpcode() == llvm::Instruction::BitCast);
330 Entry = cast<llvm::GlobalValue>(CE->getOperand(0));
332 Entry = cast<llvm::GlobalValue>(C);
339 llvm::GlobalValue *OldThunkFn = Entry;
347 Entry = cast<llvm::GlobalValue>(CGM.GetAddrOfThunk(GD, Thunk));
351 llvm::Constant *NewPtrForOldDecl =
352 llvm::ConstantExpr::getBitCast(Entry, OldThunkFn->getType());
360 llvm::Function *ThunkFn = cast<llvm::Function>(Entry);
434 llvm::Constant *CodeGenVTables::CreateVTableInitializer(
437 unsigned NumVTableThunks, llvm::Constant *RTTI) {
438 SmallVector<llvm::Constant *, 64> Inits;
440 llvm::Type *Int8PtrTy = CGM.Int8PtrTy;
442 llvm::Type *PtrDiffTy =
447 llvm::Constant *PureVirtualFn = nullptr, *DeletedVirtualFn = nullptr;
452 llvm::Constant *Init = nullptr;
456 Init = llvm::ConstantInt::get(PtrDiffTy,
458 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
461 Init = llvm::ConstantInt::get(PtrDiffTy,
463 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
466 Init = llvm::ConstantInt::get(PtrDiffTy,
468 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
471 Init = llvm::ConstantExpr::getBitCast(RTTI, Int8PtrTy);
496 llvm::FunctionType *Ty =
497 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
500 PureVirtualFn = llvm::ConstantExpr::getBitCast(PureVirtualFn,
506 llvm::FunctionType *Ty =
507 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
511 DeletedVirtualFn = llvm::ConstantExpr::getBitCast(DeletedVirtualFn,
526 llvm::Type *Ty = CGM.getTypes().GetFunctionTypeForVTable(GD);
531 Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy);
537 Init = llvm::ConstantExpr::getNullValue(Int8PtrTy);
544 llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, NumComponents);
545 return llvm::ConstantArray::get(ArrayType, Inits);
548 llvm::GlobalVariable *
552 llvm::GlobalVariable::LinkageTypes Linkage,
566 llvm::raw_svector_ostream Out(OutName);
573 llvm::ArrayType *ArrayType =
574 llvm::ArrayType::get(CGM.Int8PtrTy, VTLayout->getNumVTableComponents());
581 if (Linkage == llvm::GlobalVariable::AvailableExternallyLinkage)
582 Linkage = llvm::GlobalVariable::InternalLinkage;
585 llvm::GlobalVariable *VTable =
592 llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(
596 llvm::Constant *Init = CreateVTableInitializer(
608 llvm::GlobalVariable::LinkageTypes
611 return llvm::GlobalVariable::InternalLinkage;
628 llvm::GlobalVariable::LinkOnceODRLinkage :
629 llvm::Function::InternalLinkage;
631 return llvm::GlobalVariable::ExternalLinkage;
635 llvm::GlobalVariable::LinkOnceODRLinkage :
636 llvm::Function::InternalLinkage;
640 llvm::GlobalVariable::WeakODRLinkage :
641 llvm::Function::InternalLinkage;
651 return llvm::Function::InternalLinkage;
653 llvm::GlobalVariable::LinkageTypes DiscardableODRLinkage =
654 llvm::GlobalValue::LinkOnceODRLinkage;
655 llvm::GlobalVariable::LinkageTypes NonDiscardableODRLinkage =
656 llvm::GlobalValue::WeakODRLinkage;
662 DiscardableODRLinkage = llvm::GlobalVariable::AvailableExternallyLinkage;
663 NonDiscardableODRLinkage = llvm::GlobalVariable::AvailableExternallyLinkage;