diff options
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp index e9614b48fde7..8caee5bed8ed 100644 --- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp @@ -67,12 +67,13 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" -#include "llvm/ADT/Triple.h" #include "llvm/ADT/iterator.h" +#include "llvm/Analysis/DomTreeUpdater.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Argument.h" +#include "llvm/IR/AttributeMask.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Constant.h" @@ -96,14 +97,13 @@ #include "llvm/IR/Type.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" -#include "llvm/InitializePasses.h" -#include "llvm/Pass.h" #include "llvm/Support/Alignment.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/SpecialCaseList.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/Triple.h" #include "llvm/Transforms/Instrumentation.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" @@ -305,6 +305,14 @@ const MemoryMapParams Linux_X86_64_MemoryMapParams = { }; // NOLINTEND(readability-identifier-naming) +// loongarch64 Linux +const MemoryMapParams Linux_LoongArch64_MemoryMapParams = { + 0, // AndMask (not used) + 0x500000000000, // XorMask + 0, // ShadowBase (not used) + 0x100000000000, // OriginBase +}; + namespace { class DFSanABIList { @@ -1128,6 +1136,9 @@ bool DataFlowSanitizer::initializeModule(Module &M) { case Triple::x86_64: MapParams = &Linux_X86_64_MemoryMapParams; break; + case Triple::loongarch64: + MapParams = &Linux_LoongArch64_MemoryMapParams; + break; default: report_fatal_error("unsupported architecture"); } @@ -1256,7 +1267,7 @@ void DataFlowSanitizer::addGlobalNameSuffix(GlobalValue *GV) { size_t Pos = Asm.find(SearchStr); if (Pos != std::string::npos) { Asm.replace(Pos, SearchStr.size(), ".symver " + GVName + Suffix + ","); - Pos = Asm.find("@"); + Pos = Asm.find('@'); if (Pos == std::string::npos) report_fatal_error(Twine("unsupported .symver: ", Asm)); @@ -2156,9 +2167,8 @@ std::pair<Value *, Value *> DFSanFunction::loadShadowFast( ShadowSize == 4 ? Type::getInt32Ty(*DFS.Ctx) : Type::getInt64Ty(*DFS.Ctx); IRBuilder<> IRB(Pos); - Value *WideAddr = IRB.CreateBitCast(ShadowAddr, WideShadowTy->getPointerTo()); Value *CombinedWideShadow = - IRB.CreateAlignedLoad(WideShadowTy, WideAddr, ShadowAlign); + IRB.CreateAlignedLoad(WideShadowTy, ShadowAddr, ShadowAlign); unsigned WideShadowBitWidth = WideShadowTy->getIntegerBitWidth(); const uint64_t BytesPerWideShadow = WideShadowBitWidth / DFS.ShadowWidthBits; @@ -2195,10 +2205,10 @@ std::pair<Value *, Value *> DFSanFunction::loadShadowFast( // shadow). for (uint64_t ByteOfs = BytesPerWideShadow; ByteOfs < Size; ByteOfs += BytesPerWideShadow) { - WideAddr = IRB.CreateGEP(WideShadowTy, WideAddr, - ConstantInt::get(DFS.IntptrTy, 1)); + ShadowAddr = IRB.CreateGEP(WideShadowTy, ShadowAddr, + ConstantInt::get(DFS.IntptrTy, 1)); Value *NextWideShadow = - IRB.CreateAlignedLoad(WideShadowTy, WideAddr, ShadowAlign); + IRB.CreateAlignedLoad(WideShadowTy, ShadowAddr, ShadowAlign); CombinedWideShadow = IRB.CreateOr(CombinedWideShadow, NextWideShadow); if (ShouldTrackOrigins) { Value *NextOrigin = DFS.loadNextOrigin(Pos, OriginAlign, &OriginAddr); @@ -2526,8 +2536,9 @@ void DFSanFunction::storeOrigin(Instruction *Pos, Value *Addr, uint64_t Size, ConstantInt::get(DFS.IntptrTy, Size), Origin}); } else { Value *Cmp = convertToBool(CollapsedShadow, IRB, "_dfscmp"); + DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy); Instruction *CheckTerm = SplitBlockAndInsertIfThen( - Cmp, &*IRB.GetInsertPoint(), false, DFS.OriginStoreWeights, &DT); + Cmp, &*IRB.GetInsertPoint(), false, DFS.OriginStoreWeights, &DTU); IRBuilder<> IRBNew(CheckTerm); paintOrigin(IRBNew, updateOrigin(Origin, IRBNew), StoreOriginAddr, Size, OriginAlignment); |