1*700637cbSDimitry Andric //===AMDGPUAsanInstrumentation.h - ASAN helper functions -*- C++- *===// 2*700637cbSDimitry Andric // 3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*700637cbSDimitry Andric // 7*700637cbSDimitry Andric //===--------------------------------------------------------------===// 8*700637cbSDimitry Andric 9*700637cbSDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPU_ASAN_INSTRUMENTATION_H 10*700637cbSDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPU_ASAN_INSTRUMENTATION_H 11*700637cbSDimitry Andric 12*700637cbSDimitry Andric #include "AMDGPU.h" 13*700637cbSDimitry Andric #include "AMDGPUMemoryUtils.h" 14*700637cbSDimitry Andric #include "Utils/AMDGPUBaseInfo.h" 15*700637cbSDimitry Andric #include "llvm/ADT/SetOperations.h" 16*700637cbSDimitry Andric #include "llvm/ADT/StringExtras.h" 17*700637cbSDimitry Andric #include "llvm/ADT/StringMap.h" 18*700637cbSDimitry Andric #include "llvm/ADT/StringRef.h" 19*700637cbSDimitry Andric #include "llvm/IR/Constants.h" 20*700637cbSDimitry Andric #include "llvm/IR/DerivedTypes.h" 21*700637cbSDimitry Andric #include "llvm/IR/IRBuilder.h" 22*700637cbSDimitry Andric #include "llvm/IR/Instructions.h" 23*700637cbSDimitry Andric #include "llvm/IR/IntrinsicsAMDGPU.h" 24*700637cbSDimitry Andric #include "llvm/IR/MDBuilder.h" 25*700637cbSDimitry Andric #include "llvm/InitializePasses.h" 26*700637cbSDimitry Andric #include "llvm/Pass.h" 27*700637cbSDimitry Andric #include "llvm/Support/CommandLine.h" 28*700637cbSDimitry Andric #include "llvm/Support/Debug.h" 29*700637cbSDimitry Andric #include "llvm/Support/OptimizedStructLayout.h" 30*700637cbSDimitry Andric #include "llvm/Support/raw_ostream.h" 31*700637cbSDimitry Andric #include "llvm/Transforms/Instrumentation/AddressSanitizer.h" 32*700637cbSDimitry Andric #include "llvm/Transforms/Instrumentation/AddressSanitizerCommon.h" 33*700637cbSDimitry Andric #include "llvm/Transforms/Utils/BasicBlockUtils.h" 34*700637cbSDimitry Andric #include "llvm/Transforms/Utils/ModuleUtils.h" 35*700637cbSDimitry Andric 36*700637cbSDimitry Andric namespace llvm { 37*700637cbSDimitry Andric namespace AMDGPU { 38*700637cbSDimitry Andric 39*700637cbSDimitry Andric /// Given SizeInBytes of the Value to be instrunmented, 40*700637cbSDimitry Andric /// Returns the redzone size corresponding to it. 41*700637cbSDimitry Andric uint64_t getRedzoneSizeForGlobal(int Scale, uint64_t SizeInBytes); 42*700637cbSDimitry Andric 43*700637cbSDimitry Andric /// Instrument the memory operand Addr. 44*700637cbSDimitry Andric /// Generates report blocks that catch the addressing errors. 45*700637cbSDimitry Andric void instrumentAddress(Module &M, IRBuilder<> &IRB, Instruction *OrigIns, 46*700637cbSDimitry Andric Instruction *InsertBefore, Value *Addr, Align Alignment, 47*700637cbSDimitry Andric TypeSize TypeStoreSize, bool IsWrite, 48*700637cbSDimitry Andric Value *SizeArgument, bool UseCalls, bool Recover, 49*700637cbSDimitry Andric int Scale, int Offset); 50*700637cbSDimitry Andric 51*700637cbSDimitry Andric /// Get all the memory operands from the instruction 52*700637cbSDimitry Andric /// that needs to be instrumented 53*700637cbSDimitry Andric void getInterestingMemoryOperands( 54*700637cbSDimitry Andric Module &M, Instruction *I, 55*700637cbSDimitry Andric SmallVectorImpl<InterestingMemoryOperand> &Interesting); 56*700637cbSDimitry Andric 57*700637cbSDimitry Andric } // end namespace AMDGPU 58*700637cbSDimitry Andric } // end namespace llvm 59*700637cbSDimitry Andric 60*700637cbSDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPU_ASAN_INSTRUMENTATION_H 61