28#define DEBUG_TYPE "bpf-preserve-di-type"
38static bool BPFPreserveDITypeImpl(
Function &
F) {
39 LLVM_DEBUG(
dbgs() <<
"********** preserve debuginfo type **********\n");
44 if (
M->debug_compile_units().empty())
47 std::vector<CallInst *> PreserveDITypeCalls;
51 auto *
Call = dyn_cast<CallInst>(&
I);
55 const auto *GV = dyn_cast<GlobalValue>(
Call->getCalledOperand());
59 if (GV->getName().startswith(
"llvm.bpf.btf.type.id")) {
60 if (!
Call->getMetadata(LLVMContext::MD_preserve_access_index))
62 "Missing metadata for llvm.bpf.btf.type.id intrinsic");
63 PreserveDITypeCalls.push_back(Call);
68 if (PreserveDITypeCalls.empty())
71 std::string BaseName =
"llvm.btf_type_id.";
73 for (
auto *Call : PreserveDITypeCalls) {
81 MDNode *MD =
Call->getMetadata(LLVMContext::MD_preserve_access_index);
88 DIType *Ty = cast<DIType>(MD);
89 while (
auto *DTy = dyn_cast<DIDerivedType>(Ty)) {
90 unsigned Tag = DTy->getTag();
91 if (
Tag != dwarf::DW_TAG_const_type &&
92 Tag != dwarf::DW_TAG_volatile_type)
94 Ty = DTy->getBaseType();
98 if (isa<DISubroutineType>(Ty))
100 "SubroutineType not supported for BTF_TYPE_ID_REMOTE reloc");
110 BaseName + std::to_string(Count) +
"$" + std::to_string(Reloc);
112 *M, VarType,
false, GlobalVariable::ExternalLinkage,
nullptr, GVName);
114 GV->
setMetadata(LLVMContext::MD_preserve_access_index, MD);
121 Call->replaceAllUsesWith(PassThroughInst);
122 Call->eraseFromParent();
138char BPFPreserveDIType::ID = 0;
143 return new BPFPreserveDIType();
146bool BPFPreserveDIType::runOnFunction(
Function &
F) {
147 return BPFPreserveDITypeImpl(
F);
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
A container for analyses that lazily runs them and caches their results.
static constexpr StringRef TypeIdAttr
The attribute attached to globals representing a type id.
static Instruction * insertPassThrough(Module *M, BasicBlock *BB, Instruction *Input, Instruction *Before)
Insert a bpf passthrough builtin function.
@ BTF_TYPE_ID_LOCAL_RELOC
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM Basic Block Representation.
LLVMContext & getContext() const
Get the context in which this basic block lives.
This is the shared class of boolean and integer constants.
StringRef getName() const
FunctionPass class - This class is used to implement most global optimizations.
virtual bool runOnFunction(Function &F)=0
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
void addAttribute(Attribute::AttrKind Kind)
Add attribute to this global.
Class to represent integer types.
An instruction for reading from memory.
A Module instance is used to store all the information related to an LLVM module.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
static IntegerType * getInt64Ty(LLVMContext &C)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
This is an optimization pass for GlobalISel generic memory operations.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
FunctionPass * createBPFPreserveDIType()