diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:02:44 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:02:44 +0000 | 
| commit | 51ece4aae5857052d224ce52277924c74685714e (patch) | |
| tree | ca13cf9e2e8c2499f61f1246e455efd2804abd36 /lib/CodeGen/CGVTables.cpp | |
| parent | c192b3dcffd5e672a2b2e1730e2440febb4fb192 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/CGVTables.cpp')
| -rw-r--r-- | lib/CodeGen/CGVTables.cpp | 25 | 
1 files changed, 14 insertions, 11 deletions
| diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 969629fb5845..e36051c2053b 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -364,7 +364,7 @@ void CodeGenFunction::EmitMustTailThunk(const CXXMethodDecl *MD,    FinishFunction();  } -void CodeGenFunction::GenerateThunk(llvm::Function *Fn, +void CodeGenFunction::generateThunk(llvm::Function *Fn,                                      const CGFunctionInfo &FnInfo,                                      GlobalDecl GD, const ThunkInfo &Thunk) {    StartThunk(Fn, GD, FnInfo); @@ -376,13 +376,6 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn,    // Make the call and return the result.    EmitCallAndReturnForThunk(Callee, &Thunk); - -  // Set the right linkage. -  CGM.setFunctionLinkage(GD, Fn); - -  // Set the right visibility. -  const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); -  setThunkVisibility(CGM, MD, Thunk, Fn);  }  void CodeGenVTables::emitThunk(GlobalDecl GD, const ThunkInfo &Thunk, @@ -455,11 +448,17 @@ void CodeGenVTables::emitThunk(GlobalDecl GD, const ThunkInfo &Thunk,          CodeGenFunction(CGM).GenerateVarArgsThunk(ThunkFn, FnInfo, GD, Thunk);    } else {      // Normal thunk body generation. -    CodeGenFunction(CGM).GenerateThunk(ThunkFn, FnInfo, GD, Thunk); +    CodeGenFunction(CGM).generateThunk(ThunkFn, FnInfo, GD, Thunk);    } +  CGM.setFunctionLinkage(GD, ThunkFn);    CGM.getCXXABI().setThunkLinkage(ThunkFn, ForVTable, GD,                                    !Thunk.Return.isEmpty()); + +  // Set the right visibility. +  const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); +  setThunkVisibility(CGM, MD, Thunk, ThunkFn); +    if (CGM.supportsCOMDAT() && ThunkFn->isWeakForLinker())      ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName()));  } @@ -841,6 +840,11 @@ void CodeGenModule::EmitDeferredVTables() {    DeferredVTables.clear();  } +bool CodeGenModule::IsCFIBlacklistedRecord(const CXXRecordDecl *RD) { +  // FIXME: Make this user configurable. +  return RD->isInStdNamespace(); +} +  void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,                                              const VTableLayout &VTLayout) {    if (!LangOpts.Sanitize.has(SanitizerKind::CFIVCall) && @@ -855,8 +859,7 @@ void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,    std::vector<llvm::MDTuple *> BitsetEntries;    // Create a bit set entry for each address point.    for (auto &&AP : VTLayout.getAddressPoints()) { -    // FIXME: Add blacklisting scheme. -    if (AP.first.getBase()->isInStdNamespace()) +    if (IsCFIBlacklistedRecord(AP.first.getBase()))        continue;      BitsetEntries.push_back(CreateVTableBitSetEntry( | 
