diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 1f97e909851..5e7801f41a8 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -571,11 +571,34 @@ GlobalVariable *SanitizerCoverageModule::CreateFunctionLocalArrayInSection(    auto Array = new GlobalVariable(        *CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,        Constant::getNullValue(ArrayTy), "__sancov_gen_"); -  if (auto Comdat = F.getComdat()) +  if (auto Comdat = F.getComdat()) {      Array->setComdat(Comdat); +  } else if (TargetTriple.isOSBinFormatELF()) { +    // TODO: Refactor into a helper function and use it in ASan. +    assert(F.hasName()); +    std::string Name = F.getName(); +    if (F.hasLocalLinkage()) { +      std::string ModuleId = getUniqueModuleId(CurModule); +      Name += ModuleId.empty() ? CurModule->getModuleIdentifier() : ModuleId; +    } +    Comdat = CurModule->getOrInsertComdat(Name); +    // Make this IMAGE_COMDAT_SELECT_NODUPLICATES on COFF. Also upgrade private +    // linkage to internal linkage so that a symbol table entry is emitted. This +    // is necessary in order to create the comdat group. +    if (TargetTriple.isOSBinFormatCOFF()) { +      Comdat->setSelectionKind(Comdat::NoDuplicates); +      if (F.hasPrivateLinkage()) +        F.setLinkage(GlobalValue::InternalLinkage); +    } +    F.setComdat(Comdat); +    Array->setComdat(Comdat); +  }    Array->setSection(getSectionName(Section));    Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize()                                          : Ty->getPrimitiveSizeInBits() / 8); +  GlobalsToAppendToCompilerUsed.push_back(Array); +  MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); +  Array->addMetadata(LLVMContext::MD_associated, *MD);    return Array;  } @@ -613,23 +636,12 @@ void SanitizerCoverageModule::CreateFunctionLocalArrays(      FunctionGuardArray = CreateFunctionLocalArrayInSection(          AllBlocks.size(), F, Int32Ty, SanCovGuardsSectionName);      GlobalsToAppendToUsed.push_back(FunctionGuardArray); -    GlobalsToAppendToCompilerUsed.push_back(FunctionGuardArray); -    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); -    FunctionGuardArray->addMetadata(LLVMContext::MD_associated, *MD);    } -  if (Options.Inline8bitCounters) { +  if (Options.Inline8bitCounters)      Function8bitCounterArray = CreateFunctionLocalArrayInSection(          AllBlocks.size(), F, Int8Ty, SanCovCountersSectionName); -    GlobalsToAppendToCompilerUsed.push_back(Function8bitCounterArray); -    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); -    Function8bitCounterArray->addMetadata(LLVMContext::MD_associated, *MD); -  } -  if (Options.PCTable) { +  if (Options.PCTable)      FunctionPCsArray = CreatePCArray(F, AllBlocks); -    GlobalsToAppendToCompilerUsed.push_back(FunctionPCsArray); -    MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); -    FunctionPCsArray->addMetadata(LLVMContext::MD_associated, *MD); -  }  }  bool SanitizerCoverageModule::InjectCoverage(Function &F,  | 

