1*09467b48Spatrick //===-- ModuleUtils.cpp - Functions to manipulate Modules -----------------===// 2*09467b48Spatrick // 3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*09467b48Spatrick // 7*09467b48Spatrick //===----------------------------------------------------------------------===// 8*09467b48Spatrick // 9*09467b48Spatrick // This family of functions perform manipulations on Modules. 10*09467b48Spatrick // 11*09467b48Spatrick //===----------------------------------------------------------------------===// 12*09467b48Spatrick 13*09467b48Spatrick #include "llvm/Transforms/Utils/ModuleUtils.h" 14*09467b48Spatrick #include "llvm/Analysis/VectorUtils.h" 15*09467b48Spatrick #include "llvm/IR/DerivedTypes.h" 16*09467b48Spatrick #include "llvm/IR/Function.h" 17*09467b48Spatrick #include "llvm/IR/IRBuilder.h" 18*09467b48Spatrick #include "llvm/IR/Module.h" 19*09467b48Spatrick #include "llvm/Support/raw_ostream.h" 20*09467b48Spatrick 21*09467b48Spatrick using namespace llvm; 22*09467b48Spatrick 23*09467b48Spatrick static void appendToGlobalArray(const char *Array, Module &M, Function *F, 24*09467b48Spatrick int Priority, Constant *Data) { 25*09467b48Spatrick IRBuilder<> IRB(M.getContext()); 26*09467b48Spatrick FunctionType *FnTy = FunctionType::get(IRB.getVoidTy(), false); 27*09467b48Spatrick 28*09467b48Spatrick // Get the current set of static global constructors and add the new ctor 29*09467b48Spatrick // to the list. 30*09467b48Spatrick SmallVector<Constant *, 16> CurrentCtors; 31*09467b48Spatrick StructType *EltTy = StructType::get( 32*09467b48Spatrick IRB.getInt32Ty(), PointerType::getUnqual(FnTy), IRB.getInt8PtrTy()); 33*09467b48Spatrick if (GlobalVariable *GVCtor = M.getNamedGlobal(Array)) { 34*09467b48Spatrick if (Constant *Init = GVCtor->getInitializer()) { 35*09467b48Spatrick unsigned n = Init->getNumOperands(); 36*09467b48Spatrick CurrentCtors.reserve(n + 1); 37*09467b48Spatrick for (unsigned i = 0; i != n; ++i) 38*09467b48Spatrick CurrentCtors.push_back(cast<Constant>(Init->getOperand(i))); 39*09467b48Spatrick } 40*09467b48Spatrick GVCtor->eraseFromParent(); 41*09467b48Spatrick } 42*09467b48Spatrick 43*09467b48Spatrick // Build a 3 field global_ctor entry. We don't take a comdat key. 44*09467b48Spatrick Constant *CSVals[3]; 45*09467b48Spatrick CSVals[0] = IRB.getInt32(Priority); 46*09467b48Spatrick CSVals[1] = F; 47*09467b48Spatrick CSVals[2] = Data ? ConstantExpr::getPointerCast(Data, IRB.getInt8PtrTy()) 48*09467b48Spatrick : Constant::getNullValue(IRB.getInt8PtrTy()); 49*09467b48Spatrick Constant *RuntimeCtorInit = 50*09467b48Spatrick ConstantStruct::get(EltTy, makeArrayRef(CSVals, EltTy->getNumElements())); 51*09467b48Spatrick 52*09467b48Spatrick CurrentCtors.push_back(RuntimeCtorInit); 53*09467b48Spatrick 54*09467b48Spatrick // Create a new initializer. 55*09467b48Spatrick ArrayType *AT = ArrayType::get(EltTy, CurrentCtors.size()); 56*09467b48Spatrick Constant *NewInit = ConstantArray::get(AT, CurrentCtors); 57*09467b48Spatrick 58*09467b48Spatrick // Create the new global variable and replace all uses of 59*09467b48Spatrick // the old global variable with the new one. 60*09467b48Spatrick (void)new GlobalVariable(M, NewInit->getType(), false, 61*09467b48Spatrick GlobalValue::AppendingLinkage, NewInit, Array); 62*09467b48Spatrick } 63*09467b48Spatrick 64*09467b48Spatrick void llvm::appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data) { 65*09467b48Spatrick appendToGlobalArray("llvm.global_ctors", M, F, Priority, Data); 66*09467b48Spatrick } 67*09467b48Spatrick 68*09467b48Spatrick void llvm::appendToGlobalDtors(Module &M, Function *F, int Priority, Constant *Data) { 69*09467b48Spatrick appendToGlobalArray("llvm.global_dtors", M, F, Priority, Data); 70*09467b48Spatrick } 71*09467b48Spatrick 72*09467b48Spatrick static void appendToUsedList(Module &M, StringRef Name, ArrayRef<GlobalValue *> Values) { 73*09467b48Spatrick GlobalVariable *GV = M.getGlobalVariable(Name); 74*09467b48Spatrick SmallPtrSet<Constant *, 16> InitAsSet; 75*09467b48Spatrick SmallVector<Constant *, 16> Init; 76*09467b48Spatrick if (GV) { 77*09467b48Spatrick auto *CA = cast<ConstantArray>(GV->getInitializer()); 78*09467b48Spatrick for (auto &Op : CA->operands()) { 79*09467b48Spatrick Constant *C = cast_or_null<Constant>(Op); 80*09467b48Spatrick if (InitAsSet.insert(C).second) 81*09467b48Spatrick Init.push_back(C); 82*09467b48Spatrick } 83*09467b48Spatrick GV->eraseFromParent(); 84*09467b48Spatrick } 85*09467b48Spatrick 86*09467b48Spatrick Type *Int8PtrTy = llvm::Type::getInt8PtrTy(M.getContext()); 87*09467b48Spatrick for (auto *V : Values) { 88*09467b48Spatrick Constant *C = ConstantExpr::getBitCast(V, Int8PtrTy); 89*09467b48Spatrick if (InitAsSet.insert(C).second) 90*09467b48Spatrick Init.push_back(C); 91*09467b48Spatrick } 92*09467b48Spatrick 93*09467b48Spatrick if (Init.empty()) 94*09467b48Spatrick return; 95*09467b48Spatrick 96*09467b48Spatrick ArrayType *ATy = ArrayType::get(Int8PtrTy, Init.size()); 97*09467b48Spatrick GV = new llvm::GlobalVariable(M, ATy, false, GlobalValue::AppendingLinkage, 98*09467b48Spatrick ConstantArray::get(ATy, Init), Name); 99*09467b48Spatrick GV->setSection("llvm.metadata"); 100*09467b48Spatrick } 101*09467b48Spatrick 102*09467b48Spatrick void llvm::appendToUsed(Module &M, ArrayRef<GlobalValue *> Values) { 103*09467b48Spatrick appendToUsedList(M, "llvm.used", Values); 104*09467b48Spatrick } 105*09467b48Spatrick 106*09467b48Spatrick void llvm::appendToCompilerUsed(Module &M, ArrayRef<GlobalValue *> Values) { 107*09467b48Spatrick appendToUsedList(M, "llvm.compiler.used", Values); 108*09467b48Spatrick } 109*09467b48Spatrick 110*09467b48Spatrick FunctionCallee 111*09467b48Spatrick llvm::declareSanitizerInitFunction(Module &M, StringRef InitName, 112*09467b48Spatrick ArrayRef<Type *> InitArgTypes) { 113*09467b48Spatrick assert(!InitName.empty() && "Expected init function name"); 114*09467b48Spatrick return M.getOrInsertFunction( 115*09467b48Spatrick InitName, 116*09467b48Spatrick FunctionType::get(Type::getVoidTy(M.getContext()), InitArgTypes, false), 117*09467b48Spatrick AttributeList()); 118*09467b48Spatrick } 119*09467b48Spatrick 120*09467b48Spatrick std::pair<Function *, FunctionCallee> llvm::createSanitizerCtorAndInitFunctions( 121*09467b48Spatrick Module &M, StringRef CtorName, StringRef InitName, 122*09467b48Spatrick ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs, 123*09467b48Spatrick StringRef VersionCheckName) { 124*09467b48Spatrick assert(!InitName.empty() && "Expected init function name"); 125*09467b48Spatrick assert(InitArgs.size() == InitArgTypes.size() && 126*09467b48Spatrick "Sanitizer's init function expects different number of arguments"); 127*09467b48Spatrick FunctionCallee InitFunction = 128*09467b48Spatrick declareSanitizerInitFunction(M, InitName, InitArgTypes); 129*09467b48Spatrick Function *Ctor = Function::Create( 130*09467b48Spatrick FunctionType::get(Type::getVoidTy(M.getContext()), false), 131*09467b48Spatrick GlobalValue::InternalLinkage, CtorName, &M); 132*09467b48Spatrick BasicBlock *CtorBB = BasicBlock::Create(M.getContext(), "", Ctor); 133*09467b48Spatrick IRBuilder<> IRB(ReturnInst::Create(M.getContext(), CtorBB)); 134*09467b48Spatrick IRB.CreateCall(InitFunction, InitArgs); 135*09467b48Spatrick if (!VersionCheckName.empty()) { 136*09467b48Spatrick FunctionCallee VersionCheckFunction = M.getOrInsertFunction( 137*09467b48Spatrick VersionCheckName, FunctionType::get(IRB.getVoidTy(), {}, false), 138*09467b48Spatrick AttributeList()); 139*09467b48Spatrick IRB.CreateCall(VersionCheckFunction, {}); 140*09467b48Spatrick } 141*09467b48Spatrick return std::make_pair(Ctor, InitFunction); 142*09467b48Spatrick } 143*09467b48Spatrick 144*09467b48Spatrick std::pair<Function *, FunctionCallee> 145*09467b48Spatrick llvm::getOrCreateSanitizerCtorAndInitFunctions( 146*09467b48Spatrick Module &M, StringRef CtorName, StringRef InitName, 147*09467b48Spatrick ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs, 148*09467b48Spatrick function_ref<void(Function *, FunctionCallee)> FunctionsCreatedCallback, 149*09467b48Spatrick StringRef VersionCheckName) { 150*09467b48Spatrick assert(!CtorName.empty() && "Expected ctor function name"); 151*09467b48Spatrick 152*09467b48Spatrick if (Function *Ctor = M.getFunction(CtorName)) 153*09467b48Spatrick // FIXME: Sink this logic into the module, similar to the handling of 154*09467b48Spatrick // globals. This will make moving to a concurrent model much easier. 155*09467b48Spatrick if (Ctor->arg_size() == 0 || 156*09467b48Spatrick Ctor->getReturnType() == Type::getVoidTy(M.getContext())) 157*09467b48Spatrick return {Ctor, declareSanitizerInitFunction(M, InitName, InitArgTypes)}; 158*09467b48Spatrick 159*09467b48Spatrick Function *Ctor; 160*09467b48Spatrick FunctionCallee InitFunction; 161*09467b48Spatrick std::tie(Ctor, InitFunction) = llvm::createSanitizerCtorAndInitFunctions( 162*09467b48Spatrick M, CtorName, InitName, InitArgTypes, InitArgs, VersionCheckName); 163*09467b48Spatrick FunctionsCreatedCallback(Ctor, InitFunction); 164*09467b48Spatrick return std::make_pair(Ctor, InitFunction); 165*09467b48Spatrick } 166*09467b48Spatrick 167*09467b48Spatrick Function *llvm::getOrCreateInitFunction(Module &M, StringRef Name) { 168*09467b48Spatrick assert(!Name.empty() && "Expected init function name"); 169*09467b48Spatrick if (Function *F = M.getFunction(Name)) { 170*09467b48Spatrick if (F->arg_size() != 0 || 171*09467b48Spatrick F->getReturnType() != Type::getVoidTy(M.getContext())) { 172*09467b48Spatrick std::string Err; 173*09467b48Spatrick raw_string_ostream Stream(Err); 174*09467b48Spatrick Stream << "Sanitizer interface function defined with wrong type: " << *F; 175*09467b48Spatrick report_fatal_error(Err); 176*09467b48Spatrick } 177*09467b48Spatrick return F; 178*09467b48Spatrick } 179*09467b48Spatrick Function *F = 180*09467b48Spatrick cast<Function>(M.getOrInsertFunction(Name, AttributeList(), 181*09467b48Spatrick Type::getVoidTy(M.getContext())) 182*09467b48Spatrick .getCallee()); 183*09467b48Spatrick 184*09467b48Spatrick appendToGlobalCtors(M, F, 0); 185*09467b48Spatrick 186*09467b48Spatrick return F; 187*09467b48Spatrick } 188*09467b48Spatrick 189*09467b48Spatrick void llvm::filterDeadComdatFunctions( 190*09467b48Spatrick Module &M, SmallVectorImpl<Function *> &DeadComdatFunctions) { 191*09467b48Spatrick // Build a map from the comdat to the number of entries in that comdat we 192*09467b48Spatrick // think are dead. If this fully covers the comdat group, then the entire 193*09467b48Spatrick // group is dead. If we find another entry in the comdat group though, we'll 194*09467b48Spatrick // have to preserve the whole group. 195*09467b48Spatrick SmallDenseMap<Comdat *, int, 16> ComdatEntriesCovered; 196*09467b48Spatrick for (Function *F : DeadComdatFunctions) { 197*09467b48Spatrick Comdat *C = F->getComdat(); 198*09467b48Spatrick assert(C && "Expected all input GVs to be in a comdat!"); 199*09467b48Spatrick ComdatEntriesCovered[C] += 1; 200*09467b48Spatrick } 201*09467b48Spatrick 202*09467b48Spatrick auto CheckComdat = [&](Comdat &C) { 203*09467b48Spatrick auto CI = ComdatEntriesCovered.find(&C); 204*09467b48Spatrick if (CI == ComdatEntriesCovered.end()) 205*09467b48Spatrick return; 206*09467b48Spatrick 207*09467b48Spatrick // If this could have been covered by a dead entry, just subtract one to 208*09467b48Spatrick // account for it. 209*09467b48Spatrick if (CI->second > 0) { 210*09467b48Spatrick CI->second -= 1; 211*09467b48Spatrick return; 212*09467b48Spatrick } 213*09467b48Spatrick 214*09467b48Spatrick // If we've already accounted for all the entries that were dead, the 215*09467b48Spatrick // entire comdat is alive so remove it from the map. 216*09467b48Spatrick ComdatEntriesCovered.erase(CI); 217*09467b48Spatrick }; 218*09467b48Spatrick 219*09467b48Spatrick auto CheckAllComdats = [&] { 220*09467b48Spatrick for (Function &F : M.functions()) 221*09467b48Spatrick if (Comdat *C = F.getComdat()) { 222*09467b48Spatrick CheckComdat(*C); 223*09467b48Spatrick if (ComdatEntriesCovered.empty()) 224*09467b48Spatrick return; 225*09467b48Spatrick } 226*09467b48Spatrick for (GlobalVariable &GV : M.globals()) 227*09467b48Spatrick if (Comdat *C = GV.getComdat()) { 228*09467b48Spatrick CheckComdat(*C); 229*09467b48Spatrick if (ComdatEntriesCovered.empty()) 230*09467b48Spatrick return; 231*09467b48Spatrick } 232*09467b48Spatrick for (GlobalAlias &GA : M.aliases()) 233*09467b48Spatrick if (Comdat *C = GA.getComdat()) { 234*09467b48Spatrick CheckComdat(*C); 235*09467b48Spatrick if (ComdatEntriesCovered.empty()) 236*09467b48Spatrick return; 237*09467b48Spatrick } 238*09467b48Spatrick }; 239*09467b48Spatrick CheckAllComdats(); 240*09467b48Spatrick 241*09467b48Spatrick if (ComdatEntriesCovered.empty()) { 242*09467b48Spatrick DeadComdatFunctions.clear(); 243*09467b48Spatrick return; 244*09467b48Spatrick } 245*09467b48Spatrick 246*09467b48Spatrick // Remove the entries that were not covering. 247*09467b48Spatrick erase_if(DeadComdatFunctions, [&](GlobalValue *GV) { 248*09467b48Spatrick return ComdatEntriesCovered.find(GV->getComdat()) == 249*09467b48Spatrick ComdatEntriesCovered.end(); 250*09467b48Spatrick }); 251*09467b48Spatrick } 252*09467b48Spatrick 253*09467b48Spatrick std::string llvm::getUniqueModuleId(Module *M) { 254*09467b48Spatrick MD5 Md5; 255*09467b48Spatrick bool ExportsSymbols = false; 256*09467b48Spatrick auto AddGlobal = [&](GlobalValue &GV) { 257*09467b48Spatrick if (GV.isDeclaration() || GV.getName().startswith("llvm.") || 258*09467b48Spatrick !GV.hasExternalLinkage() || GV.hasComdat()) 259*09467b48Spatrick return; 260*09467b48Spatrick ExportsSymbols = true; 261*09467b48Spatrick Md5.update(GV.getName()); 262*09467b48Spatrick Md5.update(ArrayRef<uint8_t>{0}); 263*09467b48Spatrick }; 264*09467b48Spatrick 265*09467b48Spatrick for (auto &F : *M) 266*09467b48Spatrick AddGlobal(F); 267*09467b48Spatrick for (auto &GV : M->globals()) 268*09467b48Spatrick AddGlobal(GV); 269*09467b48Spatrick for (auto &GA : M->aliases()) 270*09467b48Spatrick AddGlobal(GA); 271*09467b48Spatrick for (auto &IF : M->ifuncs()) 272*09467b48Spatrick AddGlobal(IF); 273*09467b48Spatrick 274*09467b48Spatrick if (!ExportsSymbols) 275*09467b48Spatrick return ""; 276*09467b48Spatrick 277*09467b48Spatrick MD5::MD5Result R; 278*09467b48Spatrick Md5.final(R); 279*09467b48Spatrick 280*09467b48Spatrick SmallString<32> Str; 281*09467b48Spatrick MD5::stringifyResult(R, Str); 282*09467b48Spatrick return ("$" + Str).str(); 283*09467b48Spatrick } 284*09467b48Spatrick 285*09467b48Spatrick void VFABI::setVectorVariantNames( 286*09467b48Spatrick CallInst *CI, const SmallVector<std::string, 8> &VariantMappings) { 287*09467b48Spatrick if (VariantMappings.empty()) 288*09467b48Spatrick return; 289*09467b48Spatrick 290*09467b48Spatrick SmallString<256> Buffer; 291*09467b48Spatrick llvm::raw_svector_ostream Out(Buffer); 292*09467b48Spatrick for (const std::string &VariantMapping : VariantMappings) 293*09467b48Spatrick Out << VariantMapping << ","; 294*09467b48Spatrick // Get rid of the trailing ','. 295*09467b48Spatrick assert(!Buffer.str().empty() && "Must have at least one char."); 296*09467b48Spatrick Buffer.pop_back(); 297*09467b48Spatrick 298*09467b48Spatrick Module *M = CI->getModule(); 299*09467b48Spatrick #ifndef NDEBUG 300*09467b48Spatrick for (const std::string &VariantMapping : VariantMappings) { 301*09467b48Spatrick Optional<VFInfo> VI = VFABI::tryDemangleForVFABI(VariantMapping); 302*09467b48Spatrick assert(VI.hasValue() && "Canno add an invalid VFABI name."); 303*09467b48Spatrick assert(M->getNamedValue(VI.getValue().VectorName) && 304*09467b48Spatrick "Cannot add variant to attribute: " 305*09467b48Spatrick "vector function declaration is missing."); 306*09467b48Spatrick } 307*09467b48Spatrick #endif 308*09467b48Spatrick CI->addAttribute( 309*09467b48Spatrick AttributeList::FunctionIndex, 310*09467b48Spatrick Attribute::get(M->getContext(), MappingsAttrName, Buffer.str())); 311*09467b48Spatrick } 312