1 | //===--- CGVTables.cpp - Emit LLVM Code for C++ vtables -------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This contains code dealing with C++ code generation of virtual tables. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "CGCXXABI.h" |
14 | #include "CodeGenFunction.h" |
15 | #include "CodeGenModule.h" |
16 | #include "clang/AST/Attr.h" |
17 | #include "clang/AST/CXXInheritance.h" |
18 | #include "clang/AST/RecordLayout.h" |
19 | #include "clang/Basic/CodeGenOptions.h" |
20 | #include "clang/CodeGen/CGFunctionInfo.h" |
21 | #include "clang/CodeGen/ConstantInitBuilder.h" |
22 | #include "llvm/IR/IntrinsicInst.h" |
23 | #include "llvm/Support/Format.h" |
24 | #include "llvm/Transforms/Utils/Cloning.h" |
25 | #include <algorithm> |
26 | #include <cstdio> |
27 | |
28 | using namespace clang; |
29 | using namespace CodeGen; |
30 | |
31 | CodeGenVTables::CodeGenVTables(CodeGenModule &CGM) |
32 | : CGM(CGM), VTContext(CGM.getContext().getVTableContext()) {} |
33 | |
34 | llvm::Constant *CodeGenModule::GetAddrOfThunk(StringRef Name, llvm::Type *FnTy, |
35 | GlobalDecl GD) { |
36 | return GetOrCreateLLVMFunction(Name, FnTy, GD, /*ForVTable=*/true, |
37 | /*DontDefer=*/true, /*IsThunk=*/true); |
38 | } |
39 | |
40 | static void setThunkProperties(CodeGenModule &CGM, const ThunkInfo &Thunk, |
41 | llvm::Function *ThunkFn, bool ForVTable, |
42 | GlobalDecl GD) { |
43 | CGM.setFunctionLinkage(GD, ThunkFn); |
44 | CGM.getCXXABI().setThunkLinkage(ThunkFn, ForVTable, GD, |
45 | !Thunk.Return.isEmpty()); |
46 | |
47 | // Set the right visibility. |
48 | CGM.setGVProperties(ThunkFn, GD); |
49 | |
50 | if (!CGM.getCXXABI().exportThunk()) { |
51 | ThunkFn->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); |
52 | ThunkFn->setDSOLocal(true); |
53 | } |
54 | |
55 | if (CGM.supportsCOMDAT() && ThunkFn->isWeakForLinker()) |
56 | ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName())); |
57 | } |
58 | |
59 | #ifndef NDEBUG |
60 | static bool similar(const ABIArgInfo &infoL, CanQualType typeL, |
61 | const ABIArgInfo &infoR, CanQualType typeR) { |
62 | return (infoL.getKind() == infoR.getKind() && |
63 | (typeL == typeR || |
64 | (isa<PointerType>(typeL) && isa<PointerType>(typeR)) || |
65 | (isa<ReferenceType>(typeL) && isa<ReferenceType>(typeR)))); |
66 | } |
67 | #endif |
68 | |
69 | static RValue PerformReturnAdjustment(CodeGenFunction &CGF, |
70 | QualType ResultType, RValue RV, |
71 | const ThunkInfo &Thunk) { |
72 | // Emit the return adjustment. |
73 | bool NullCheckValue = !ResultType->isReferenceType(); |
74 | |
75 | llvm::BasicBlock *AdjustNull = nullptr; |
76 | llvm::BasicBlock *AdjustNotNull = nullptr; |
77 | llvm::BasicBlock *AdjustEnd = nullptr; |
78 | |
79 | llvm::Value *ReturnValue = RV.getScalarVal(); |
80 | |
81 | if (NullCheckValue) { |
82 | AdjustNull = CGF.createBasicBlock("adjust.null" ); |
83 | AdjustNotNull = CGF.createBasicBlock("adjust.notnull" ); |
84 | AdjustEnd = CGF.createBasicBlock("adjust.end" ); |
85 | |
86 | llvm::Value *IsNull = CGF.Builder.CreateIsNull(ReturnValue); |
87 | CGF.Builder.CreateCondBr(IsNull, AdjustNull, AdjustNotNull); |
88 | CGF.EmitBlock(AdjustNotNull); |
89 | } |
90 | |
91 | auto ClassDecl = ResultType->getPointeeType()->getAsCXXRecordDecl(); |
92 | auto ClassAlign = CGF.CGM.getClassPointerAlignment(ClassDecl); |
93 | ReturnValue = CGF.CGM.getCXXABI().performReturnAdjustment(CGF, |
94 | Address(ReturnValue, ClassAlign), |
95 | Thunk.Return); |
96 | |
97 | if (NullCheckValue) { |
98 | CGF.Builder.CreateBr(AdjustEnd); |
99 | CGF.EmitBlock(AdjustNull); |
100 | CGF.Builder.CreateBr(AdjustEnd); |
101 | CGF.EmitBlock(AdjustEnd); |
102 | |
103 | llvm::PHINode *PHI = CGF.Builder.CreatePHI(ReturnValue->getType(), 2); |
104 | PHI->addIncoming(ReturnValue, AdjustNotNull); |
105 | PHI->addIncoming(llvm::Constant::getNullValue(ReturnValue->getType()), |
106 | AdjustNull); |
107 | ReturnValue = PHI; |
108 | } |
109 | |
110 | return RValue::get(ReturnValue); |
111 | } |
112 | |
113 | /// This function clones a function's DISubprogram node and enters it into |
114 | /// a value map with the intent that the map can be utilized by the cloner |
115 | /// to short-circuit Metadata node mapping. |
116 | /// Furthermore, the function resolves any DILocalVariable nodes referenced |
117 | /// by dbg.value intrinsics so they can be properly mapped during cloning. |
118 | static void resolveTopLevelMetadata(llvm::Function *Fn, |
119 | llvm::ValueToValueMapTy &VMap) { |
120 | // Clone the DISubprogram node and put it into the Value map. |
121 | auto *DIS = Fn->getSubprogram(); |
122 | if (!DIS) |
123 | return; |
124 | auto *NewDIS = DIS->replaceWithDistinct(DIS->clone()); |
125 | VMap.MD()[DIS].reset(NewDIS); |
126 | |
127 | // Find all llvm.dbg.declare intrinsics and resolve the DILocalVariable nodes |
128 | // they are referencing. |
129 | for (auto &BB : Fn->getBasicBlockList()) { |
130 | for (auto &I : BB) { |
131 | if (auto *DII = dyn_cast<llvm::DbgVariableIntrinsic>(&I)) { |
132 | auto *DILocal = DII->getVariable(); |
133 | if (!DILocal->isResolved()) |
134 | DILocal->resolve(); |
135 | } |
136 | } |
137 | } |
138 | } |
139 | |
140 | // This function does roughly the same thing as GenerateThunk, but in a |
141 | // very different way, so that va_start and va_end work correctly. |
142 | // FIXME: This function assumes "this" is the first non-sret LLVM argument of |
143 | // a function, and that there is an alloca built in the entry block |
144 | // for all accesses to "this". |
145 | // FIXME: This function assumes there is only one "ret" statement per function. |
146 | // FIXME: Cloning isn't correct in the presence of indirect goto! |
147 | // FIXME: This implementation of thunks bloats codesize by duplicating the |
148 | // function definition. There are alternatives: |
149 | // 1. Add some sort of stub support to LLVM for cases where we can |
150 | // do a this adjustment, then a sibcall. |
151 | // 2. We could transform the definition to take a va_list instead of an |
152 | // actual variable argument list, then have the thunks (including a |
153 | // no-op thunk for the regular definition) call va_start/va_end. |
154 | // There's a bit of per-call overhead for this solution, but it's |
155 | // better for codesize if the definition is long. |
156 | llvm::Function * |
157 | CodeGenFunction::GenerateVarArgsThunk(llvm::Function *Fn, |
158 | const CGFunctionInfo &FnInfo, |
159 | GlobalDecl GD, const ThunkInfo &Thunk) { |
160 | const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); |
161 | const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>(); |
162 | QualType ResultType = FPT->getReturnType(); |
163 | |
164 | // Get the original function |
165 | assert(FnInfo.isVariadic()); |
166 | llvm::Type *Ty = CGM.getTypes().GetFunctionType(FnInfo); |
167 | llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); |
168 | llvm::Function *BaseFn = cast<llvm::Function>(Callee); |
169 | |
170 | // Cloning can't work if we don't have a definition. The Microsoft ABI may |
171 | // require thunks when a definition is not available. Emit an error in these |
172 | // cases. |
173 | if (!MD->isDefined()) { |
174 | CGM.ErrorUnsupported(MD, "return-adjusting thunk with variadic arguments" ); |
175 | return Fn; |
176 | } |
177 | assert(!BaseFn->isDeclaration() && "cannot clone undefined variadic method" ); |
178 | |
179 | // Clone to thunk. |
180 | llvm::ValueToValueMapTy VMap; |
181 | |
182 | // We are cloning a function while some Metadata nodes are still unresolved. |
183 | // Ensure that the value mapper does not encounter any of them. |
184 | resolveTopLevelMetadata(BaseFn, VMap); |
185 | llvm::Function *NewFn = llvm::CloneFunction(BaseFn, VMap); |
186 | Fn->replaceAllUsesWith(NewFn); |
187 | NewFn->takeName(Fn); |
188 | Fn->eraseFromParent(); |
189 | Fn = NewFn; |
190 | |
191 | // "Initialize" CGF (minimally). |
192 | CurFn = Fn; |
193 | |
194 | // Get the "this" value |
195 | llvm::Function::arg_iterator AI = Fn->arg_begin(); |
196 | if (CGM.ReturnTypeUsesSRet(FnInfo)) |
197 | ++AI; |
198 | |
199 | // Find the first store of "this", which will be to the alloca associated |
200 | // with "this". |
201 | Address ThisPtr(&*AI, CGM.getClassPointerAlignment(MD->getParent())); |
202 | llvm::BasicBlock *EntryBB = &Fn->front(); |
203 | llvm::BasicBlock::iterator ThisStore = |
204 | std::find_if(EntryBB->begin(), EntryBB->end(), [&](llvm::Instruction &I) { |
205 | return isa<llvm::StoreInst>(I) && |
206 | I.getOperand(0) == ThisPtr.getPointer(); |
207 | }); |
208 | assert(ThisStore != EntryBB->end() && |
209 | "Store of this should be in entry block?" ); |
210 | // Adjust "this", if necessary. |
211 | Builder.SetInsertPoint(&*ThisStore); |
212 | llvm::Value *AdjustedThisPtr = |
213 | CGM.getCXXABI().performThisAdjustment(*this, ThisPtr, Thunk.This); |
214 | AdjustedThisPtr = Builder.CreateBitCast(AdjustedThisPtr, |
215 | ThisStore->getOperand(0)->getType()); |
216 | ThisStore->setOperand(0, AdjustedThisPtr); |
217 | |
218 | if (!Thunk.Return.isEmpty()) { |
219 | // Fix up the returned value, if necessary. |
220 | for (llvm::BasicBlock &BB : *Fn) { |
221 | llvm::Instruction *T = BB.getTerminator(); |
222 | if (isa<llvm::ReturnInst>(T)) { |
223 | RValue RV = RValue::get(T->getOperand(0)); |
224 | T->eraseFromParent(); |
225 | Builder.SetInsertPoint(&BB); |
226 | RV = PerformReturnAdjustment(*this, ResultType, RV, Thunk); |
227 | Builder.CreateRet(RV.getScalarVal()); |
228 | break; |
229 | } |
230 | } |
231 | } |
232 | |
233 | return Fn; |
234 | } |
235 | |
236 | void CodeGenFunction::StartThunk(llvm::Function *Fn, GlobalDecl GD, |
237 | const CGFunctionInfo &FnInfo, |
238 | bool IsUnprototyped) { |
239 | assert(!CurGD.getDecl() && "CurGD was already set!" ); |
240 | CurGD = GD; |
241 | CurFuncIsThunk = true; |
242 | |
243 | // Build FunctionArgs. |
244 | const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); |
245 | QualType ThisType = MD->getThisType(); |
246 | QualType ResultType; |
247 | if (IsUnprototyped) |
248 | ResultType = CGM.getContext().VoidTy; |
249 | else if (CGM.getCXXABI().HasThisReturn(GD)) |
250 | ResultType = ThisType; |
251 | else if (CGM.getCXXABI().hasMostDerivedReturn(GD)) |
252 | ResultType = CGM.getContext().VoidPtrTy; |
253 | else |
254 | ResultType = MD->getType()->castAs<FunctionProtoType>()->getReturnType(); |
255 | FunctionArgList FunctionArgs; |
256 | |
257 | // Create the implicit 'this' parameter declaration. |
258 | CGM.getCXXABI().buildThisParam(*this, FunctionArgs); |
259 | |
260 | // Add the rest of the parameters, if we have a prototype to work with. |
261 | if (!IsUnprototyped) { |
262 | FunctionArgs.append(MD->param_begin(), MD->param_end()); |
263 | |
264 | if (isa<CXXDestructorDecl>(MD)) |
265 | CGM.getCXXABI().addImplicitStructorParams(*this, ResultType, |
266 | FunctionArgs); |
267 | } |
268 | |
269 | // Start defining the function. |
270 | auto NL = ApplyDebugLocation::CreateEmpty(*this); |
271 | StartFunction(GlobalDecl(), ResultType, Fn, FnInfo, FunctionArgs, |
272 | MD->getLocation()); |
273 | // Create a scope with an artificial location for the body of this function. |
274 | auto AL = ApplyDebugLocation::CreateArtificial(*this); |
275 | |
276 | // Since we didn't pass a GlobalDecl to StartFunction, do this ourselves. |
277 | CGM.getCXXABI().EmitInstanceFunctionProlog(*this); |
278 | CXXThisValue = CXXABIThisValue; |
279 | CurCodeDecl = MD; |
280 | CurFuncDecl = MD; |
281 | } |
282 | |
283 | void CodeGenFunction::FinishThunk() { |
284 | // Clear these to restore the invariants expected by |
285 | // StartFunction/FinishFunction. |
286 | CurCodeDecl = nullptr; |
287 | CurFuncDecl = nullptr; |
288 | |
289 | FinishFunction(); |
290 | } |
291 | |
292 | void CodeGenFunction::EmitCallAndReturnForThunk(llvm::FunctionCallee Callee, |
293 | const ThunkInfo *Thunk, |
294 | bool IsUnprototyped) { |
295 | assert(isa<CXXMethodDecl>(CurGD.getDecl()) && |
296 | "Please use a new CGF for this thunk" ); |
297 | const CXXMethodDecl *MD = cast<CXXMethodDecl>(CurGD.getDecl()); |
298 | |
299 | // Adjust the 'this' pointer if necessary |
300 | llvm::Value *AdjustedThisPtr = |
301 | Thunk ? CGM.getCXXABI().performThisAdjustment( |
302 | *this, LoadCXXThisAddress(), Thunk->This) |
303 | : LoadCXXThis(); |
304 | |
305 | // If perfect forwarding is required a variadic method, a method using |
306 | // inalloca, or an unprototyped thunk, use musttail. Emit an error if this |
307 | // thunk requires a return adjustment, since that is impossible with musttail. |
308 | if (CurFnInfo->usesInAlloca() || CurFnInfo->isVariadic() || IsUnprototyped) { |
309 | if (Thunk && !Thunk->Return.isEmpty()) { |
310 | if (IsUnprototyped) |
311 | CGM.ErrorUnsupported( |
312 | MD, "return-adjusting thunk with incomplete parameter type" ); |
313 | else if (CurFnInfo->isVariadic()) |
314 | llvm_unreachable("shouldn't try to emit musttail return-adjusting " |
315 | "thunks for variadic functions" ); |
316 | else |
317 | CGM.ErrorUnsupported( |
318 | MD, "non-trivial argument copy for return-adjusting thunk" ); |
319 | } |
320 | EmitMustTailThunk(CurGD, AdjustedThisPtr, Callee); |
321 | return; |
322 | } |
323 | |
324 | // Start building CallArgs. |
325 | CallArgList CallArgs; |
326 | QualType ThisType = MD->getThisType(); |
327 | CallArgs.add(RValue::get(AdjustedThisPtr), ThisType); |
328 | |
329 | if (isa<CXXDestructorDecl>(MD)) |
330 | CGM.getCXXABI().adjustCallArgsForDestructorThunk(*this, CurGD, CallArgs); |
331 | |
332 | #ifndef NDEBUG |
333 | unsigned PrefixArgs = CallArgs.size() - 1; |
334 | #endif |
335 | // Add the rest of the arguments. |
336 | for (const ParmVarDecl *PD : MD->parameters()) |
337 | EmitDelegateCallArg(CallArgs, PD, SourceLocation()); |
338 | |
339 | const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>(); |
340 | |
341 | #ifndef NDEBUG |
342 | const CGFunctionInfo &CallFnInfo = CGM.getTypes().arrangeCXXMethodCall( |
343 | CallArgs, FPT, RequiredArgs::forPrototypePlus(FPT, 1), PrefixArgs); |
344 | assert(CallFnInfo.getRegParm() == CurFnInfo->getRegParm() && |
345 | CallFnInfo.isNoReturn() == CurFnInfo->isNoReturn() && |
346 | CallFnInfo.getCallingConvention() == CurFnInfo->getCallingConvention()); |
347 | assert(isa<CXXDestructorDecl>(MD) || // ignore dtor return types |
348 | similar(CallFnInfo.getReturnInfo(), CallFnInfo.getReturnType(), |
349 | CurFnInfo->getReturnInfo(), CurFnInfo->getReturnType())); |
350 | assert(CallFnInfo.arg_size() == CurFnInfo->arg_size()); |
351 | for (unsigned i = 0, e = CurFnInfo->arg_size(); i != e; ++i) |
352 | assert(similar(CallFnInfo.arg_begin()[i].info, |
353 | CallFnInfo.arg_begin()[i].type, |
354 | CurFnInfo->arg_begin()[i].info, |
355 | CurFnInfo->arg_begin()[i].type)); |
356 | #endif |
357 | |
358 | // Determine whether we have a return value slot to use. |
359 | QualType ResultType = CGM.getCXXABI().HasThisReturn(CurGD) |
360 | ? ThisType |
361 | : CGM.getCXXABI().hasMostDerivedReturn(CurGD) |
362 | ? CGM.getContext().VoidPtrTy |
363 | : FPT->getReturnType(); |
364 | ReturnValueSlot Slot; |
365 | if (!ResultType->isVoidType() && |
366 | (CurFnInfo->getReturnInfo().getKind() == ABIArgInfo::Indirect || |
367 | hasAggregateEvaluationKind(ResultType))) |
368 | Slot = ReturnValueSlot(ReturnValue, ResultType.isVolatileQualified(), |
369 | /*IsUnused=*/false, /*IsExternallyDestructed=*/true); |
370 | |
371 | // Now emit our call. |
372 | llvm::CallBase *CallOrInvoke; |
373 | RValue RV = EmitCall(*CurFnInfo, CGCallee::forDirect(Callee, CurGD), Slot, |
374 | CallArgs, &CallOrInvoke); |
375 | |
376 | // Consider return adjustment if we have ThunkInfo. |
377 | if (Thunk && !Thunk->Return.isEmpty()) |
378 | RV = PerformReturnAdjustment(*this, ResultType, RV, *Thunk); |
379 | else if (llvm::CallInst* Call = dyn_cast<llvm::CallInst>(CallOrInvoke)) |
380 | Call->setTailCallKind(llvm::CallInst::TCK_Tail); |
381 | |
382 | // Emit return. |
383 | if (!ResultType->isVoidType() && Slot.isNull()) |
384 | CGM.getCXXABI().EmitReturnFromThunk(*this, RV, ResultType); |
385 | |
386 | // Disable the final ARC autorelease. |
387 | AutoreleaseResult = false; |
388 | |
389 | FinishThunk(); |
390 | } |
391 | |
392 | void CodeGenFunction::EmitMustTailThunk(GlobalDecl GD, |
393 | llvm::Value *AdjustedThisPtr, |
394 | llvm::FunctionCallee Callee) { |
395 | // Emitting a musttail call thunk doesn't use any of the CGCall.cpp machinery |
396 | // to translate AST arguments into LLVM IR arguments. For thunks, we know |
397 | // that the caller prototype more or less matches the callee prototype with |
398 | // the exception of 'this'. |
399 | SmallVector<llvm::Value *, 8> Args; |
400 | for (llvm::Argument &A : CurFn->args()) |
401 | Args.push_back(&A); |
402 | |
403 | // Set the adjusted 'this' pointer. |
404 | const ABIArgInfo &ThisAI = CurFnInfo->arg_begin()->info; |
405 | if (ThisAI.isDirect()) { |
406 | const ABIArgInfo &RetAI = CurFnInfo->getReturnInfo(); |
407 | int ThisArgNo = RetAI.isIndirect() && !RetAI.isSRetAfterThis() ? 1 : 0; |
408 | llvm::Type *ThisType = Args[ThisArgNo]->getType(); |
409 | if (ThisType != AdjustedThisPtr->getType()) |
410 | AdjustedThisPtr = Builder.CreateBitCast(AdjustedThisPtr, ThisType); |
411 | Args[ThisArgNo] = AdjustedThisPtr; |
412 | } else { |
413 | assert(ThisAI.isInAlloca() && "this is passed directly or inalloca" ); |
414 | Address ThisAddr = GetAddrOfLocalVar(CXXABIThisDecl); |
415 | llvm::Type *ThisType = ThisAddr.getElementType(); |
416 | if (ThisType != AdjustedThisPtr->getType()) |
417 | AdjustedThisPtr = Builder.CreateBitCast(AdjustedThisPtr, ThisType); |
418 | Builder.CreateStore(AdjustedThisPtr, ThisAddr); |
419 | } |
420 | |
421 | // Emit the musttail call manually. Even if the prologue pushed cleanups, we |
422 | // don't actually want to run them. |
423 | llvm::CallInst *Call = Builder.CreateCall(Callee, Args); |
424 | Call->setTailCallKind(llvm::CallInst::TCK_MustTail); |
425 | |
426 | // Apply the standard set of call attributes. |
427 | unsigned CallingConv; |
428 | llvm::AttributeList Attrs; |
429 | CGM.ConstructAttributeList(Callee.getCallee()->getName(), *CurFnInfo, GD, |
430 | Attrs, CallingConv, /*AttrOnCallSite=*/true); |
431 | Call->setAttributes(Attrs); |
432 | Call->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv)); |
433 | |
434 | if (Call->getType()->isVoidTy()) |
435 | Builder.CreateRetVoid(); |
436 | else |
437 | Builder.CreateRet(Call); |
438 | |
439 | // Finish the function to maintain CodeGenFunction invariants. |
440 | // FIXME: Don't emit unreachable code. |
441 | EmitBlock(createBasicBlock()); |
442 | |
443 | FinishThunk(); |
444 | } |
445 | |
446 | void CodeGenFunction::generateThunk(llvm::Function *Fn, |
447 | const CGFunctionInfo &FnInfo, GlobalDecl GD, |
448 | const ThunkInfo &Thunk, |
449 | bool IsUnprototyped) { |
450 | StartThunk(Fn, GD, FnInfo, IsUnprototyped); |
451 | // Create a scope with an artificial location for the body of this function. |
452 | auto AL = ApplyDebugLocation::CreateArtificial(*this); |
453 | |
454 | // Get our callee. Use a placeholder type if this method is unprototyped so |
455 | // that CodeGenModule doesn't try to set attributes. |
456 | llvm::Type *Ty; |
457 | if (IsUnprototyped) |
458 | Ty = llvm::StructType::get(getLLVMContext()); |
459 | else |
460 | Ty = CGM.getTypes().GetFunctionType(FnInfo); |
461 | |
462 | llvm::Constant *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); |
463 | |
464 | // Fix up the function type for an unprototyped musttail call. |
465 | if (IsUnprototyped) |
466 | Callee = llvm::ConstantExpr::getBitCast(Callee, Fn->getType()); |
467 | |
468 | // Make the call and return the result. |
469 | EmitCallAndReturnForThunk(llvm::FunctionCallee(Fn->getFunctionType(), Callee), |
470 | &Thunk, IsUnprototyped); |
471 | } |
472 | |
473 | static bool shouldEmitVTableThunk(CodeGenModule &CGM, const CXXMethodDecl *MD, |
474 | bool IsUnprototyped, bool ForVTable) { |
475 | // Always emit thunks in the MS C++ ABI. We cannot rely on other TUs to |
476 | // provide thunks for us. |
477 | if (CGM.getTarget().getCXXABI().isMicrosoft()) |
478 | return true; |
479 | |
480 | // In the Itanium C++ ABI, vtable thunks are provided by TUs that provide |
481 | // definitions of the main method. Therefore, emitting thunks with the vtable |
482 | // is purely an optimization. Emit the thunk if optimizations are enabled and |
483 | // all of the parameter types are complete. |
484 | if (ForVTable) |
485 | return CGM.getCodeGenOpts().OptimizationLevel && !IsUnprototyped; |
486 | |
487 | // Always emit thunks along with the method definition. |
488 | return true; |
489 | } |
490 | |
491 | llvm::Constant *CodeGenVTables::maybeEmitThunk(GlobalDecl GD, |
492 | const ThunkInfo &TI, |
493 | bool ForVTable) { |
494 | const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); |
495 | |
496 | // First, get a declaration. Compute the mangled name. Don't worry about |
497 | // getting the function prototype right, since we may only need this |
498 | // declaration to fill in a vtable slot. |
499 | SmallString<256> Name; |
500 | MangleContext &MCtx = CGM.getCXXABI().getMangleContext(); |
501 | llvm::raw_svector_ostream Out(Name); |
502 | if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) |
503 | MCtx.mangleCXXDtorThunk(DD, GD.getDtorType(), TI.This, Out); |
504 | else |
505 | MCtx.mangleThunk(MD, TI, Out); |
506 | llvm::Type *ThunkVTableTy = CGM.getTypes().GetFunctionTypeForVTable(GD); |
507 | llvm::Constant *Thunk = CGM.GetAddrOfThunk(Name, ThunkVTableTy, GD); |
508 | |
509 | // If we don't need to emit a definition, return this declaration as is. |
510 | bool IsUnprototyped = !CGM.getTypes().isFuncTypeConvertible( |
511 | MD->getType()->castAs<FunctionType>()); |
512 | if (!shouldEmitVTableThunk(CGM, MD, IsUnprototyped, ForVTable)) |
513 | return Thunk; |
514 | |
515 | // Arrange a function prototype appropriate for a function definition. In some |
516 | // cases in the MS ABI, we may need to build an unprototyped musttail thunk. |
517 | const CGFunctionInfo &FnInfo = |
518 | IsUnprototyped ? CGM.getTypes().arrangeUnprototypedMustTailThunk(MD) |
519 | : CGM.getTypes().arrangeGlobalDeclaration(GD); |
520 | llvm::FunctionType *ThunkFnTy = CGM.getTypes().GetFunctionType(FnInfo); |
521 | |
522 | // If the type of the underlying GlobalValue is wrong, we'll have to replace |
523 | // it. It should be a declaration. |
524 | llvm::Function *ThunkFn = cast<llvm::Function>(Thunk->stripPointerCasts()); |
525 | if (ThunkFn->getFunctionType() != ThunkFnTy) { |
526 | llvm::GlobalValue *OldThunkFn = ThunkFn; |
527 | |
528 | assert(OldThunkFn->isDeclaration() && "Shouldn't replace non-declaration" ); |
529 | |
530 | // Remove the name from the old thunk function and get a new thunk. |
531 | OldThunkFn->setName(StringRef()); |
532 | ThunkFn = llvm::Function::Create(ThunkFnTy, llvm::Function::ExternalLinkage, |
533 | Name.str(), &CGM.getModule()); |
534 | CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn); |
535 | |
536 | // If needed, replace the old thunk with a bitcast. |
537 | if (!OldThunkFn->use_empty()) { |
538 | llvm::Constant *NewPtrForOldDecl = |
539 | llvm::ConstantExpr::getBitCast(ThunkFn, OldThunkFn->getType()); |
540 | OldThunkFn->replaceAllUsesWith(NewPtrForOldDecl); |
541 | } |
542 | |
543 | // Remove the old thunk. |
544 | OldThunkFn->eraseFromParent(); |
545 | } |
546 | |
547 | bool ABIHasKeyFunctions = CGM.getTarget().getCXXABI().hasKeyFunctions(); |
548 | bool UseAvailableExternallyLinkage = ForVTable && ABIHasKeyFunctions; |
549 | |
550 | if (!ThunkFn->isDeclaration()) { |
551 | if (!ABIHasKeyFunctions || UseAvailableExternallyLinkage) { |
552 | // There is already a thunk emitted for this function, do nothing. |
553 | return ThunkFn; |
554 | } |
555 | |
556 | setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD); |
557 | return ThunkFn; |
558 | } |
559 | |
560 | // If this will be unprototyped, add the "thunk" attribute so that LLVM knows |
561 | // that the return type is meaningless. These thunks can be used to call |
562 | // functions with differing return types, and the caller is required to cast |
563 | // the prototype appropriately to extract the correct value. |
564 | if (IsUnprototyped) |
565 | ThunkFn->addFnAttr("thunk" ); |
566 | |
567 | CGM.SetLLVMFunctionAttributesForDefinition(GD.getDecl(), ThunkFn); |
568 | |
569 | // Thunks for variadic methods are special because in general variadic |
570 | // arguments cannot be perfectly forwarded. In the general case, clang |
571 | // implements such thunks by cloning the original function body. However, for |
572 | // thunks with no return adjustment on targets that support musttail, we can |
573 | // use musttail to perfectly forward the variadic arguments. |
574 | bool ShouldCloneVarArgs = false; |
575 | if (!IsUnprototyped && ThunkFn->isVarArg()) { |
576 | ShouldCloneVarArgs = true; |
577 | if (TI.Return.isEmpty()) { |
578 | switch (CGM.getTriple().getArch()) { |
579 | case llvm::Triple::x86_64: |
580 | case llvm::Triple::x86: |
581 | case llvm::Triple::aarch64: |
582 | ShouldCloneVarArgs = false; |
583 | break; |
584 | default: |
585 | break; |
586 | } |
587 | } |
588 | } |
589 | |
590 | if (ShouldCloneVarArgs) { |
591 | if (UseAvailableExternallyLinkage) |
592 | return ThunkFn; |
593 | ThunkFn = |
594 | CodeGenFunction(CGM).GenerateVarArgsThunk(ThunkFn, FnInfo, GD, TI); |
595 | } else { |
596 | // Normal thunk body generation. |
597 | CodeGenFunction(CGM).generateThunk(ThunkFn, FnInfo, GD, TI, IsUnprototyped); |
598 | } |
599 | |
600 | setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD); |
601 | return ThunkFn; |
602 | } |
603 | |
604 | void CodeGenVTables::EmitThunks(GlobalDecl GD) { |
605 | const CXXMethodDecl *MD = |
606 | cast<CXXMethodDecl>(GD.getDecl())->getCanonicalDecl(); |
607 | |
608 | // We don't need to generate thunks for the base destructor. |
609 | if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base) |
610 | return; |
611 | |
612 | const VTableContextBase::ThunkInfoVectorTy *ThunkInfoVector = |
613 | VTContext->getThunkInfo(GD); |
614 | |
615 | if (!ThunkInfoVector) |
616 | return; |
617 | |
618 | for (const ThunkInfo& Thunk : *ThunkInfoVector) |
619 | maybeEmitThunk(GD, Thunk, /*ForVTable=*/false); |
620 | } |
621 | |
622 | void CodeGenVTables::addRelativeComponent(ConstantArrayBuilder &builder, |
623 | llvm::Constant *component, |
624 | unsigned vtableAddressPoint, |
625 | bool vtableHasLocalLinkage, |
626 | bool isCompleteDtor) const { |
627 | // No need to get the offset of a nullptr. |
628 | if (component->isNullValue()) |
629 | return builder.add(llvm::ConstantInt::get(CGM.Int32Ty, 0)); |
630 | |
631 | auto *globalVal = |
632 | cast<llvm::GlobalValue>(component->stripPointerCastsAndAliases()); |
633 | llvm::Module &module = CGM.getModule(); |
634 | |
635 | // We don't want to copy the linkage of the vtable exactly because we still |
636 | // want the stub/proxy to be emitted for properly calculating the offset. |
637 | // Examples where there would be no symbol emitted are available_externally |
638 | // and private linkages. |
639 | auto stubLinkage = vtableHasLocalLinkage ? llvm::GlobalValue::InternalLinkage |
640 | : llvm::GlobalValue::ExternalLinkage; |
641 | |
642 | llvm::Constant *target; |
643 | if (auto *func = dyn_cast<llvm::Function>(globalVal)) { |
644 | target = llvm::DSOLocalEquivalent::get(func); |
645 | } else { |
646 | llvm::SmallString<16> rttiProxyName(globalVal->getName()); |
647 | rttiProxyName.append(".rtti_proxy" ); |
648 | |
649 | // The RTTI component may not always be emitted in the same linkage unit as |
650 | // the vtable. As a general case, we can make a dso_local proxy to the RTTI |
651 | // that points to the actual RTTI struct somewhere. This will result in a |
652 | // GOTPCREL relocation when taking the relative offset to the proxy. |
653 | llvm::GlobalVariable *proxy = module.getNamedGlobal(rttiProxyName); |
654 | if (!proxy) { |
655 | proxy = new llvm::GlobalVariable(module, globalVal->getType(), |
656 | /*isConstant=*/true, stubLinkage, |
657 | globalVal, rttiProxyName); |
658 | proxy->setDSOLocal(true); |
659 | proxy->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); |
660 | if (!proxy->hasLocalLinkage()) { |
661 | proxy->setVisibility(llvm::GlobalValue::HiddenVisibility); |
662 | proxy->setComdat(module.getOrInsertComdat(rttiProxyName)); |
663 | } |
664 | } |
665 | target = proxy; |
666 | } |
667 | |
668 | builder.addRelativeOffsetToPosition(CGM.Int32Ty, target, |
669 | /*position=*/vtableAddressPoint); |
670 | } |
671 | |
672 | bool CodeGenVTables::useRelativeLayout() const { |
673 | return CGM.getTarget().getCXXABI().isItaniumFamily() && |
674 | CGM.getItaniumVTableContext().isRelativeLayout(); |
675 | } |
676 | |
677 | llvm::Type *CodeGenVTables::getVTableComponentType() const { |
678 | if (useRelativeLayout()) |
679 | return CGM.Int32Ty; |
680 | return CGM.Int8PtrTy; |
681 | } |
682 | |
683 | static void AddPointerLayoutOffset(const CodeGenModule &CGM, |
684 | ConstantArrayBuilder &builder, |
685 | CharUnits offset) { |
686 | builder.add(llvm::ConstantExpr::getIntToPtr( |
687 | llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity()), |
688 | CGM.Int8PtrTy)); |
689 | } |
690 | |
691 | static void AddRelativeLayoutOffset(const CodeGenModule &CGM, |
692 | ConstantArrayBuilder &builder, |
693 | CharUnits offset) { |
694 | builder.add(llvm::ConstantInt::get(CGM.Int32Ty, offset.getQuantity())); |
695 | } |
696 | |
697 | void CodeGenVTables::addVTableComponent(ConstantArrayBuilder &builder, |
698 | const VTableLayout &layout, |
699 | unsigned componentIndex, |
700 | llvm::Constant *rtti, |
701 | unsigned &nextVTableThunkIndex, |
702 | unsigned vtableAddressPoint, |
703 | bool vtableHasLocalLinkage) { |
704 | auto &component = layout.vtable_components()[componentIndex]; |
705 | |
706 | auto addOffsetConstant = |
707 | useRelativeLayout() ? AddRelativeLayoutOffset : AddPointerLayoutOffset; |
708 | |
709 | switch (component.getKind()) { |
710 | case VTableComponent::CK_VCallOffset: |
711 | return addOffsetConstant(CGM, builder, component.getVCallOffset()); |
712 | |
713 | case VTableComponent::CK_VBaseOffset: |
714 | return addOffsetConstant(CGM, builder, component.getVBaseOffset()); |
715 | |
716 | case VTableComponent::CK_OffsetToTop: |
717 | return addOffsetConstant(CGM, builder, component.getOffsetToTop()); |
718 | |
719 | case VTableComponent::CK_RTTI: |
720 | if (useRelativeLayout()) |
721 | return addRelativeComponent(builder, rtti, vtableAddressPoint, |
722 | vtableHasLocalLinkage, |
723 | /*isCompleteDtor=*/false); |
724 | else |
725 | return builder.add(llvm::ConstantExpr::getBitCast(rtti, CGM.Int8PtrTy)); |
726 | |
727 | case VTableComponent::CK_FunctionPointer: |
728 | case VTableComponent::CK_CompleteDtorPointer: |
729 | case VTableComponent::CK_DeletingDtorPointer: { |
730 | GlobalDecl GD; |
731 | |
732 | // Get the right global decl. |
733 | switch (component.getKind()) { |
734 | default: |
735 | llvm_unreachable("Unexpected vtable component kind" ); |
736 | case VTableComponent::CK_FunctionPointer: |
737 | GD = component.getFunctionDecl(); |
738 | break; |
739 | case VTableComponent::CK_CompleteDtorPointer: |
740 | GD = GlobalDecl(component.getDestructorDecl(), Dtor_Complete); |
741 | break; |
742 | case VTableComponent::CK_DeletingDtorPointer: |
743 | GD = GlobalDecl(component.getDestructorDecl(), Dtor_Deleting); |
744 | break; |
745 | } |
746 | |
747 | if (CGM.getLangOpts().CUDA) { |
748 | // Emit NULL for methods we can't codegen on this |
749 | // side. Otherwise we'd end up with vtable with unresolved |
750 | // references. |
751 | const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); |
752 | // OK on device side: functions w/ __device__ attribute |
753 | // OK on host side: anything except __device__-only functions. |
754 | bool CanEmitMethod = |
755 | CGM.getLangOpts().CUDAIsDevice |
756 | ? MD->hasAttr<CUDADeviceAttr>() |
757 | : (MD->hasAttr<CUDAHostAttr>() || !MD->hasAttr<CUDADeviceAttr>()); |
758 | if (!CanEmitMethod) |
759 | return builder.add(llvm::ConstantExpr::getNullValue(CGM.Int8PtrTy)); |
760 | // Method is acceptable, continue processing as usual. |
761 | } |
762 | |
763 | auto getSpecialVirtualFn = [&](StringRef name) -> llvm::Constant * { |
764 | // FIXME(PR43094): When merging comdat groups, lld can select a local |
765 | // symbol as the signature symbol even though it cannot be accessed |
766 | // outside that symbol's TU. The relative vtables ABI would make |
767 | // __cxa_pure_virtual and __cxa_deleted_virtual local symbols, and |
768 | // depending on link order, the comdat groups could resolve to the one |
769 | // with the local symbol. As a temporary solution, fill these components |
770 | // with zero. We shouldn't be calling these in the first place anyway. |
771 | if (useRelativeLayout()) |
772 | return llvm::ConstantPointerNull::get(CGM.Int8PtrTy); |
773 | |
774 | // For NVPTX devices in OpenMP emit special functon as null pointers, |
775 | // otherwise linking ends up with unresolved references. |
776 | if (CGM.getLangOpts().OpenMP && CGM.getLangOpts().OpenMPIsDevice && |
777 | CGM.getTriple().isNVPTX()) |
778 | return llvm::ConstantPointerNull::get(CGM.Int8PtrTy); |
779 | llvm::FunctionType *fnTy = |
780 | llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false); |
781 | llvm::Constant *fn = cast<llvm::Constant>( |
782 | CGM.CreateRuntimeFunction(fnTy, name).getCallee()); |
783 | if (auto f = dyn_cast<llvm::Function>(fn)) |
784 | f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); |
785 | return llvm::ConstantExpr::getBitCast(fn, CGM.Int8PtrTy); |
786 | }; |
787 | |
788 | llvm::Constant *fnPtr; |
789 | |
790 | // Pure virtual member functions. |
791 | if (cast<CXXMethodDecl>(GD.getDecl())->isPure()) { |
792 | if (!PureVirtualFn) |
793 | PureVirtualFn = |
794 | getSpecialVirtualFn(CGM.getCXXABI().GetPureVirtualCallName()); |
795 | fnPtr = PureVirtualFn; |
796 | |
797 | // Deleted virtual member functions. |
798 | } else if (cast<CXXMethodDecl>(GD.getDecl())->isDeleted()) { |
799 | if (!DeletedVirtualFn) |
800 | DeletedVirtualFn = |
801 | getSpecialVirtualFn(CGM.getCXXABI().GetDeletedVirtualCallName()); |
802 | fnPtr = DeletedVirtualFn; |
803 | |
804 | // Thunks. |
805 | } else if (nextVTableThunkIndex < layout.vtable_thunks().size() && |
806 | layout.vtable_thunks()[nextVTableThunkIndex].first == |
807 | componentIndex) { |
808 | auto &thunkInfo = layout.vtable_thunks()[nextVTableThunkIndex].second; |
809 | |
810 | nextVTableThunkIndex++; |
811 | fnPtr = maybeEmitThunk(GD, thunkInfo, /*ForVTable=*/true); |
812 | |
813 | // Otherwise we can use the method definition directly. |
814 | } else { |
815 | llvm::Type *fnTy = CGM.getTypes().GetFunctionTypeForVTable(GD); |
816 | fnPtr = CGM.GetAddrOfFunction(GD, fnTy, /*ForVTable=*/true); |
817 | } |
818 | |
819 | if (useRelativeLayout()) { |
820 | return addRelativeComponent( |
821 | builder, fnPtr, vtableAddressPoint, vtableHasLocalLinkage, |
822 | component.getKind() == VTableComponent::CK_CompleteDtorPointer); |
823 | } else |
824 | return builder.add(llvm::ConstantExpr::getBitCast(fnPtr, CGM.Int8PtrTy)); |
825 | } |
826 | |
827 | case VTableComponent::CK_UnusedFunctionPointer: |
828 | if (useRelativeLayout()) |
829 | return builder.add(llvm::ConstantExpr::getNullValue(CGM.Int32Ty)); |
830 | else |
831 | return builder.addNullPointer(CGM.Int8PtrTy); |
832 | } |
833 | |
834 | llvm_unreachable("Unexpected vtable component kind" ); |
835 | } |
836 | |
837 | llvm::Type *CodeGenVTables::getVTableType(const VTableLayout &layout) { |
838 | SmallVector<llvm::Type *, 4> tys; |
839 | llvm::Type *componentType = getVTableComponentType(); |
840 | for (unsigned i = 0, e = layout.getNumVTables(); i != e; ++i) |
841 | tys.push_back(llvm::ArrayType::get(componentType, layout.getVTableSize(i))); |
842 | |
843 | return llvm::StructType::get(CGM.getLLVMContext(), tys); |
844 | } |
845 | |
846 | void CodeGenVTables::createVTableInitializer(ConstantStructBuilder &builder, |
847 | const VTableLayout &layout, |
848 | llvm::Constant *rtti, |
849 | bool vtableHasLocalLinkage) { |
850 | llvm::Type *componentType = getVTableComponentType(); |
851 | |
852 | const auto &addressPoints = layout.getAddressPointIndices(); |
853 | unsigned nextVTableThunkIndex = 0; |
854 | for (unsigned vtableIndex = 0, endIndex = layout.getNumVTables(); |
855 | vtableIndex != endIndex; ++vtableIndex) { |
856 | auto vtableElem = builder.beginArray(componentType); |
857 | |
858 | size_t vtableStart = layout.getVTableOffset(vtableIndex); |
859 | size_t vtableEnd = vtableStart + layout.getVTableSize(vtableIndex); |
860 | for (size_t componentIndex = vtableStart; componentIndex < vtableEnd; |
861 | ++componentIndex) { |
862 | addVTableComponent(vtableElem, layout, componentIndex, rtti, |
863 | nextVTableThunkIndex, addressPoints[vtableIndex], |
864 | vtableHasLocalLinkage); |
865 | } |
866 | vtableElem.finishAndAddTo(builder); |
867 | } |
868 | } |
869 | |
870 | llvm::GlobalVariable *CodeGenVTables::GenerateConstructionVTable( |
871 | const CXXRecordDecl *RD, const BaseSubobject &Base, bool BaseIsVirtual, |
872 | llvm::GlobalVariable::LinkageTypes Linkage, |
873 | VTableAddressPointsMapTy &AddressPoints) { |
874 | if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) |
875 | DI->completeClassData(Base.getBase()); |
876 | |
877 | std::unique_ptr<VTableLayout> VTLayout( |
878 | getItaniumVTableContext().createConstructionVTableLayout( |
879 | Base.getBase(), Base.getBaseOffset(), BaseIsVirtual, RD)); |
880 | |
881 | // Add the address points. |
882 | AddressPoints = VTLayout->getAddressPoints(); |
883 | |
884 | // Get the mangled construction vtable name. |
885 | SmallString<256> OutName; |
886 | llvm::raw_svector_ostream Out(OutName); |
887 | cast<ItaniumMangleContext>(CGM.getCXXABI().getMangleContext()) |
888 | .mangleCXXCtorVTable(RD, Base.getBaseOffset().getQuantity(), |
889 | Base.getBase(), Out); |
890 | SmallString<256> Name(OutName); |
891 | |
892 | bool UsingRelativeLayout = getItaniumVTableContext().isRelativeLayout(); |
893 | bool VTableAliasExists = |
894 | UsingRelativeLayout && CGM.getModule().getNamedAlias(Name); |
895 | if (VTableAliasExists) { |
896 | // We previously made the vtable hidden and changed its name. |
897 | Name.append(".local" ); |
898 | } |
899 | |
900 | llvm::Type *VTType = getVTableType(*VTLayout); |
901 | |
902 | // Construction vtable symbols are not part of the Itanium ABI, so we cannot |
903 | // guarantee that they actually will be available externally. Instead, when |
904 | // emitting an available_externally VTT, we provide references to an internal |
905 | // linkage construction vtable. The ABI only requires complete-object vtables |
906 | // to be the same for all instances of a type, not construction vtables. |
907 | if (Linkage == llvm::GlobalVariable::AvailableExternallyLinkage) |
908 | Linkage = llvm::GlobalVariable::InternalLinkage; |
909 | |
910 | unsigned Align = CGM.getDataLayout().getABITypeAlignment(VTType); |
911 | |
912 | // Create the variable that will hold the construction vtable. |
913 | llvm::GlobalVariable *VTable = |
914 | CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage, Align); |
915 | |
916 | // V-tables are always unnamed_addr. |
917 | VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); |
918 | |
919 | llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor( |
920 | CGM.getContext().getTagDeclType(Base.getBase())); |
921 | |
922 | // Create and set the initializer. |
923 | ConstantInitBuilder builder(CGM); |
924 | auto components = builder.beginStruct(); |
925 | createVTableInitializer(components, *VTLayout, RTTI, |
926 | VTable->hasLocalLinkage()); |
927 | components.finishAndSetAsInitializer(VTable); |
928 | |
929 | // Set properties only after the initializer has been set to ensure that the |
930 | // GV is treated as definition and not declaration. |
931 | assert(!VTable->isDeclaration() && "Shouldn't set properties on declaration" ); |
932 | CGM.setGVProperties(VTable, RD); |
933 | |
934 | CGM.EmitVTableTypeMetadata(RD, VTable, *VTLayout.get()); |
935 | |
936 | if (UsingRelativeLayout && !VTable->isDSOLocal()) |
937 | GenerateRelativeVTableAlias(VTable, OutName); |
938 | |
939 | return VTable; |
940 | } |
941 | |
942 | // If the VTable is not dso_local, then we will not be able to indicate that |
943 | // the VTable does not need a relocation and move into rodata. A frequent |
944 | // time this can occur is for classes that should be made public from a DSO |
945 | // (like in libc++). For cases like these, we can make the vtable hidden or |
946 | // private and create a public alias with the same visibility and linkage as |
947 | // the original vtable type. |
948 | void CodeGenVTables::GenerateRelativeVTableAlias(llvm::GlobalVariable *VTable, |
949 | llvm::StringRef AliasNameRef) { |
950 | assert(getItaniumVTableContext().isRelativeLayout() && |
951 | "Can only use this if the relative vtable ABI is used" ); |
952 | assert(!VTable->isDSOLocal() && "This should be called only if the vtable is " |
953 | "not guaranteed to be dso_local" ); |
954 | |
955 | // If the vtable is available_externally, we shouldn't (or need to) generate |
956 | // an alias for it in the first place since the vtable won't actually by |
957 | // emitted in this compilation unit. |
958 | if (VTable->hasAvailableExternallyLinkage()) |
959 | return; |
960 | |
961 | // Create a new string in the event the alias is already the name of the |
962 | // vtable. Using the reference directly could lead to use of an inititialized |
963 | // value in the module's StringMap. |
964 | llvm::SmallString<256> AliasName(AliasNameRef); |
965 | VTable->setName(AliasName + ".local" ); |
966 | |
967 | auto Linkage = VTable->getLinkage(); |
968 | assert(llvm::GlobalAlias::isValidLinkage(Linkage) && |
969 | "Invalid vtable alias linkage" ); |
970 | |
971 | llvm::GlobalAlias *VTableAlias = CGM.getModule().getNamedAlias(AliasName); |
972 | if (!VTableAlias) { |
973 | VTableAlias = llvm::GlobalAlias::create(VTable->getValueType(), |
974 | VTable->getAddressSpace(), Linkage, |
975 | AliasName, &CGM.getModule()); |
976 | } else { |
977 | assert(VTableAlias->getValueType() == VTable->getValueType()); |
978 | assert(VTableAlias->getLinkage() == Linkage); |
979 | } |
980 | VTableAlias->setVisibility(VTable->getVisibility()); |
981 | VTableAlias->setUnnamedAddr(VTable->getUnnamedAddr()); |
982 | |
983 | // Both of these imply dso_local for the vtable. |
984 | if (!VTable->hasComdat()) { |
985 | // If this is in a comdat, then we shouldn't make the linkage private due to |
986 | // an issue in lld where private symbols can be used as the key symbol when |
987 | // choosing the prevelant group. This leads to "relocation refers to a |
988 | // symbol in a discarded section". |
989 | VTable->setLinkage(llvm::GlobalValue::PrivateLinkage); |
990 | } else { |
991 | // We should at least make this hidden since we don't want to expose it. |
992 | VTable->setVisibility(llvm::GlobalValue::HiddenVisibility); |
993 | } |
994 | |
995 | VTableAlias->setAliasee(VTable); |
996 | } |
997 | |
998 | static bool shouldEmitAvailableExternallyVTable(const CodeGenModule &CGM, |
999 | const CXXRecordDecl *RD) { |
1000 | return CGM.getCodeGenOpts().OptimizationLevel > 0 && |
1001 | CGM.getCXXABI().canSpeculativelyEmitVTable(RD); |
1002 | } |
1003 | |
1004 | /// Compute the required linkage of the vtable for the given class. |
1005 | /// |
1006 | /// Note that we only call this at the end of the translation unit. |
1007 | llvm::GlobalVariable::LinkageTypes |
1008 | CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) { |
1009 | if (!RD->isExternallyVisible()) |
1010 | return llvm::GlobalVariable::InternalLinkage; |
1011 | |
1012 | // We're at the end of the translation unit, so the current key |
1013 | // function is fully correct. |
1014 | const CXXMethodDecl *keyFunction = Context.getCurrentKeyFunction(RD); |
1015 | if (keyFunction && !RD->hasAttr<DLLImportAttr>()) { |
1016 | // If this class has a key function, use that to determine the |
1017 | // linkage of the vtable. |
1018 | const FunctionDecl *def = nullptr; |
1019 | if (keyFunction->hasBody(def)) |
1020 | keyFunction = cast<CXXMethodDecl>(def); |
1021 | |
1022 | switch (keyFunction->getTemplateSpecializationKind()) { |
1023 | case TSK_Undeclared: |
1024 | case TSK_ExplicitSpecialization: |
1025 | assert((def || CodeGenOpts.OptimizationLevel > 0 || |
1026 | CodeGenOpts.getDebugInfo() != codegenoptions::NoDebugInfo) && |
1027 | "Shouldn't query vtable linkage without key function, " |
1028 | "optimizations, or debug info" ); |
1029 | if (!def && CodeGenOpts.OptimizationLevel > 0) |
1030 | return llvm::GlobalVariable::AvailableExternallyLinkage; |
1031 | |
1032 | if (keyFunction->isInlined()) |
1033 | return !Context.getLangOpts().AppleKext ? |
1034 | llvm::GlobalVariable::LinkOnceODRLinkage : |
1035 | llvm::Function::InternalLinkage; |
1036 | |
1037 | return llvm::GlobalVariable::ExternalLinkage; |
1038 | |
1039 | case TSK_ImplicitInstantiation: |
1040 | return !Context.getLangOpts().AppleKext ? |
1041 | llvm::GlobalVariable::LinkOnceODRLinkage : |
1042 | llvm::Function::InternalLinkage; |
1043 | |
1044 | case TSK_ExplicitInstantiationDefinition: |
1045 | return !Context.getLangOpts().AppleKext ? |
1046 | llvm::GlobalVariable::WeakODRLinkage : |
1047 | llvm::Function::InternalLinkage; |
1048 | |
1049 | case TSK_ExplicitInstantiationDeclaration: |
1050 | llvm_unreachable("Should not have been asked to emit this" ); |
1051 | } |
1052 | } |
1053 | |
1054 | // -fapple-kext mode does not support weak linkage, so we must use |
1055 | // internal linkage. |
1056 | if (Context.getLangOpts().AppleKext) |
1057 | return llvm::Function::InternalLinkage; |
1058 | |
1059 | llvm::GlobalVariable::LinkageTypes DiscardableODRLinkage = |
1060 | llvm::GlobalValue::LinkOnceODRLinkage; |
1061 | llvm::GlobalVariable::LinkageTypes NonDiscardableODRLinkage = |
1062 | llvm::GlobalValue::WeakODRLinkage; |
1063 | if (RD->hasAttr<DLLExportAttr>()) { |
1064 | // Cannot discard exported vtables. |
1065 | DiscardableODRLinkage = NonDiscardableODRLinkage; |
1066 | } else if (RD->hasAttr<DLLImportAttr>()) { |
1067 | // Imported vtables are available externally. |
1068 | DiscardableODRLinkage = llvm::GlobalVariable::AvailableExternallyLinkage; |
1069 | NonDiscardableODRLinkage = llvm::GlobalVariable::AvailableExternallyLinkage; |
1070 | } |
1071 | |
1072 | switch (RD->getTemplateSpecializationKind()) { |
1073 | case TSK_Undeclared: |
1074 | case TSK_ExplicitSpecialization: |
1075 | case TSK_ImplicitInstantiation: |
1076 | return DiscardableODRLinkage; |
1077 | |
1078 | case TSK_ExplicitInstantiationDeclaration: |
1079 | // Explicit instantiations in MSVC do not provide vtables, so we must emit |
1080 | // our own. |
1081 | if (getTarget().getCXXABI().isMicrosoft()) |
1082 | return DiscardableODRLinkage; |
1083 | return shouldEmitAvailableExternallyVTable(*this, RD) |
1084 | ? llvm::GlobalVariable::AvailableExternallyLinkage |
1085 | : llvm::GlobalVariable::ExternalLinkage; |
1086 | |
1087 | case TSK_ExplicitInstantiationDefinition: |
1088 | return NonDiscardableODRLinkage; |
1089 | } |
1090 | |
1091 | llvm_unreachable("Invalid TemplateSpecializationKind!" ); |
1092 | } |
1093 | |
1094 | /// This is a callback from Sema to tell us that a particular vtable is |
1095 | /// required to be emitted in this translation unit. |
1096 | /// |
1097 | /// This is only called for vtables that _must_ be emitted (mainly due to key |
1098 | /// functions). For weak vtables, CodeGen tracks when they are needed and |
1099 | /// emits them as-needed. |
1100 | void CodeGenModule::EmitVTable(CXXRecordDecl *theClass) { |
1101 | VTables.GenerateClassData(theClass); |
1102 | } |
1103 | |
1104 | void |
1105 | CodeGenVTables::GenerateClassData(const CXXRecordDecl *RD) { |
1106 | if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) |
1107 | DI->completeClassData(RD); |
1108 | |
1109 | if (RD->getNumVBases()) |
1110 | CGM.getCXXABI().emitVirtualInheritanceTables(RD); |
1111 | |
1112 | CGM.getCXXABI().emitVTableDefinitions(*this, RD); |
1113 | } |
1114 | |
1115 | /// At this point in the translation unit, does it appear that can we |
1116 | /// rely on the vtable being defined elsewhere in the program? |
1117 | /// |
1118 | /// The response is really only definitive when called at the end of |
1119 | /// the translation unit. |
1120 | /// |
1121 | /// The only semantic restriction here is that the object file should |
1122 | /// not contain a vtable definition when that vtable is defined |
1123 | /// strongly elsewhere. Otherwise, we'd just like to avoid emitting |
1124 | /// vtables when unnecessary. |
1125 | bool CodeGenVTables::isVTableExternal(const CXXRecordDecl *RD) { |
1126 | assert(RD->isDynamicClass() && "Non-dynamic classes have no VTable." ); |
1127 | |
1128 | // We always synthesize vtables if they are needed in the MS ABI. MSVC doesn't |
1129 | // emit them even if there is an explicit template instantiation. |
1130 | if (CGM.getTarget().getCXXABI().isMicrosoft()) |
1131 | return false; |
1132 | |
1133 | // If we have an explicit instantiation declaration (and not a |
1134 | // definition), the vtable is defined elsewhere. |
1135 | TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind(); |
1136 | if (TSK == TSK_ExplicitInstantiationDeclaration) |
1137 | return true; |
1138 | |
1139 | // Otherwise, if the class is an instantiated template, the |
1140 | // vtable must be defined here. |
1141 | if (TSK == TSK_ImplicitInstantiation || |
1142 | TSK == TSK_ExplicitInstantiationDefinition) |
1143 | return false; |
1144 | |
1145 | // Otherwise, if the class doesn't have a key function (possibly |
1146 | // anymore), the vtable must be defined here. |
1147 | const CXXMethodDecl *keyFunction = CGM.getContext().getCurrentKeyFunction(RD); |
1148 | if (!keyFunction) |
1149 | return false; |
1150 | |
1151 | // Otherwise, if we don't have a definition of the key function, the |
1152 | // vtable must be defined somewhere else. |
1153 | return !keyFunction->hasBody(); |
1154 | } |
1155 | |
1156 | /// Given that we're currently at the end of the translation unit, and |
1157 | /// we've emitted a reference to the vtable for this class, should |
1158 | /// we define that vtable? |
1159 | static bool shouldEmitVTableAtEndOfTranslationUnit(CodeGenModule &CGM, |
1160 | const CXXRecordDecl *RD) { |
1161 | // If vtable is internal then it has to be done. |
1162 | if (!CGM.getVTables().isVTableExternal(RD)) |
1163 | return true; |
1164 | |
1165 | // If it's external then maybe we will need it as available_externally. |
1166 | return shouldEmitAvailableExternallyVTable(CGM, RD); |
1167 | } |
1168 | |
1169 | /// Given that at some point we emitted a reference to one or more |
1170 | /// vtables, and that we are now at the end of the translation unit, |
1171 | /// decide whether we should emit them. |
1172 | void CodeGenModule::EmitDeferredVTables() { |
1173 | #ifndef NDEBUG |
1174 | // Remember the size of DeferredVTables, because we're going to assume |
1175 | // that this entire operation doesn't modify it. |
1176 | size_t savedSize = DeferredVTables.size(); |
1177 | #endif |
1178 | |
1179 | for (const CXXRecordDecl *RD : DeferredVTables) |
1180 | if (shouldEmitVTableAtEndOfTranslationUnit(*this, RD)) |
1181 | VTables.GenerateClassData(RD); |
1182 | else if (shouldOpportunisticallyEmitVTables()) |
1183 | OpportunisticVTables.push_back(RD); |
1184 | |
1185 | assert(savedSize == DeferredVTables.size() && |
1186 | "deferred extra vtables during vtable emission?" ); |
1187 | DeferredVTables.clear(); |
1188 | } |
1189 | |
1190 | bool CodeGenModule::HasLTOVisibilityPublicStd(const CXXRecordDecl *RD) { |
1191 | if (!getCodeGenOpts().LTOVisibilityPublicStd) |
1192 | return false; |
1193 | |
1194 | const DeclContext *DC = RD; |
1195 | while (1) { |
1196 | auto *D = cast<Decl>(DC); |
1197 | DC = DC->getParent(); |
1198 | if (isa<TranslationUnitDecl>(DC->getRedeclContext())) { |
1199 | if (auto *ND = dyn_cast<NamespaceDecl>(D)) |
1200 | if (const IdentifierInfo *II = ND->getIdentifier()) |
1201 | if (II->isStr("std" ) || II->isStr("stdext" )) |
1202 | return true; |
1203 | break; |
1204 | } |
1205 | } |
1206 | |
1207 | return false; |
1208 | } |
1209 | |
1210 | bool CodeGenModule::HasHiddenLTOVisibility(const CXXRecordDecl *RD) { |
1211 | LinkageInfo LV = RD->getLinkageAndVisibility(); |
1212 | if (!isExternallyVisible(LV.getLinkage())) |
1213 | return true; |
1214 | |
1215 | if (RD->hasAttr<LTOVisibilityPublicAttr>() || RD->hasAttr<UuidAttr>()) |
1216 | return false; |
1217 | |
1218 | if (getTriple().isOSBinFormatCOFF()) { |
1219 | if (RD->hasAttr<DLLExportAttr>() || RD->hasAttr<DLLImportAttr>()) |
1220 | return false; |
1221 | } else { |
1222 | if (LV.getVisibility() != HiddenVisibility) |
1223 | return false; |
1224 | } |
1225 | |
1226 | return !HasLTOVisibilityPublicStd(RD); |
1227 | } |
1228 | |
1229 | llvm::GlobalObject::VCallVisibility CodeGenModule::GetVCallVisibilityLevel( |
1230 | const CXXRecordDecl *RD, llvm::DenseSet<const CXXRecordDecl *> &Visited) { |
1231 | // If we have already visited this RD (which means this is a recursive call |
1232 | // since the initial call should have an empty Visited set), return the max |
1233 | // visibility. The recursive calls below compute the min between the result |
1234 | // of the recursive call and the current TypeVis, so returning the max here |
1235 | // ensures that it will have no effect on the current TypeVis. |
1236 | if (!Visited.insert(RD).second) |
1237 | return llvm::GlobalObject::VCallVisibilityTranslationUnit; |
1238 | |
1239 | LinkageInfo LV = RD->getLinkageAndVisibility(); |
1240 | llvm::GlobalObject::VCallVisibility TypeVis; |
1241 | if (!isExternallyVisible(LV.getLinkage())) |
1242 | TypeVis = llvm::GlobalObject::VCallVisibilityTranslationUnit; |
1243 | else if (HasHiddenLTOVisibility(RD)) |
1244 | TypeVis = llvm::GlobalObject::VCallVisibilityLinkageUnit; |
1245 | else |
1246 | TypeVis = llvm::GlobalObject::VCallVisibilityPublic; |
1247 | |
1248 | for (auto B : RD->bases()) |
1249 | if (B.getType()->getAsCXXRecordDecl()->isDynamicClass()) |
1250 | TypeVis = std::min( |
1251 | TypeVis, |
1252 | GetVCallVisibilityLevel(B.getType()->getAsCXXRecordDecl(), Visited)); |
1253 | |
1254 | for (auto B : RD->vbases()) |
1255 | if (B.getType()->getAsCXXRecordDecl()->isDynamicClass()) |
1256 | TypeVis = std::min( |
1257 | TypeVis, |
1258 | GetVCallVisibilityLevel(B.getType()->getAsCXXRecordDecl(), Visited)); |
1259 | |
1260 | return TypeVis; |
1261 | } |
1262 | |
1263 | void CodeGenModule::EmitVTableTypeMetadata(const CXXRecordDecl *RD, |
1264 | llvm::GlobalVariable *VTable, |
1265 | const VTableLayout &VTLayout) { |
1266 | if (!getCodeGenOpts().LTOUnit) |
1267 | return; |
1268 | |
1269 | CharUnits PointerWidth = |
1270 | Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0)); |
1271 | |
1272 | typedef std::pair<const CXXRecordDecl *, unsigned> AddressPoint; |
1273 | std::vector<AddressPoint> AddressPoints; |
1274 | for (auto &&AP : VTLayout.getAddressPoints()) |
1275 | AddressPoints.push_back(std::make_pair( |
1276 | AP.first.getBase(), VTLayout.getVTableOffset(AP.second.VTableIndex) + |
1277 | AP.second.AddressPointIndex)); |
1278 | |
1279 | // Sort the address points for determinism. |
1280 | llvm::sort(AddressPoints, [this](const AddressPoint &AP1, |
1281 | const AddressPoint &AP2) { |
1282 | if (&AP1 == &AP2) |
1283 | return false; |
1284 | |
1285 | std::string S1; |
1286 | llvm::raw_string_ostream O1(S1); |
1287 | getCXXABI().getMangleContext().mangleTypeName( |
1288 | QualType(AP1.first->getTypeForDecl(), 0), O1); |
1289 | O1.flush(); |
1290 | |
1291 | std::string S2; |
1292 | llvm::raw_string_ostream O2(S2); |
1293 | getCXXABI().getMangleContext().mangleTypeName( |
1294 | QualType(AP2.first->getTypeForDecl(), 0), O2); |
1295 | O2.flush(); |
1296 | |
1297 | if (S1 < S2) |
1298 | return true; |
1299 | if (S1 != S2) |
1300 | return false; |
1301 | |
1302 | return AP1.second < AP2.second; |
1303 | }); |
1304 | |
1305 | ArrayRef<VTableComponent> Comps = VTLayout.vtable_components(); |
1306 | for (auto AP : AddressPoints) { |
1307 | // Create type metadata for the address point. |
1308 | AddVTableTypeMetadata(VTable, PointerWidth * AP.second, AP.first); |
1309 | |
1310 | // The class associated with each address point could also potentially be |
1311 | // used for indirect calls via a member function pointer, so we need to |
1312 | // annotate the address of each function pointer with the appropriate member |
1313 | // function pointer type. |
1314 | for (unsigned I = 0; I != Comps.size(); ++I) { |
1315 | if (Comps[I].getKind() != VTableComponent::CK_FunctionPointer) |
1316 | continue; |
1317 | llvm::Metadata *MD = CreateMetadataIdentifierForVirtualMemPtrType( |
1318 | Context.getMemberPointerType( |
1319 | Comps[I].getFunctionDecl()->getType(), |
1320 | Context.getRecordType(AP.first).getTypePtr())); |
1321 | VTable->addTypeMetadata((PointerWidth * I).getQuantity(), MD); |
1322 | } |
1323 | } |
1324 | |
1325 | if (getCodeGenOpts().VirtualFunctionElimination || |
1326 | getCodeGenOpts().WholeProgramVTables) { |
1327 | llvm::DenseSet<const CXXRecordDecl *> Visited; |
1328 | llvm::GlobalObject::VCallVisibility TypeVis = |
1329 | GetVCallVisibilityLevel(RD, Visited); |
1330 | if (TypeVis != llvm::GlobalObject::VCallVisibilityPublic) |
1331 | VTable->setVCallVisibilityMetadata(TypeVis); |
1332 | } |
1333 | } |
1334 | |