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;
59 if (GV->getName().starts_with(
"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);
91 unsigned Tag = DTy->getTag();
92 if (Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type)
94 Ty = DTy->getBaseType();
98 if (Ty->getName().empty()) {
101 "SubroutineType not supported for BTF_TYPE_ID_REMOTE reloc");
111 BaseName + std::to_string(
Count) +
"$" + std::to_string(
Reloc);
115 GV->
setMetadata(LLVMContext::MD_preserve_access_index, MD);
119 Call->getIterator());
122 Call->replaceAllUsesWith(PassThroughInst);
123 Call->eraseFromParent();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the layout of .BTF and .BTF.ext ELF sections.
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.
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.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
This is the shared class of boolean and integer constants.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
@ ExternalLinkage
Externally visible function.
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.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Flag
These should be considered private to the implementation of the MCInstrDesc class.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.