yonghong-song created this revision. yonghong-song added reviewers: arsenm, aprantl, Anastasia, ast. yonghong-song added a project: debug-info. Herald added subscribers: cfe-commits, wdng. Herald added a project: clang.
The RFC intends to kick off the discussion on how to support user defined address_space attributes in dwarf. The use case: ============= In linux kernel, under certain make flags, pointers may be annotated with additional address_space information. The source code is below: https://github.com/torvalds/linux/blob/master/include/linux/compiler_types.h For example, we have 1. define __user __attribute__((noderef, address_space(1))) 2. define __kernel __attribute__((address_space(0))) 3. define __iomem __attribute__((noderef, address_space(2))) 4. define __percpu __attribute__((noderef, address_space(3))) 5. define __rcu __attribute__((noderef, address_space(4))) Currently, the address_space annotation is not used when compiling a normal (production) kernel. It is typically used during development and used by 'sparse' tool to check proper pointer usage. Now there is a growing need to put address_space info into debug info, e.g., dwarf, in linux binary to help automatically differentiate pointers accessing kernel and user memories in order to avoid explicit user annotations like below: http://lkml.iu.edu/hypermail/linux/kernel/1905.1/05750.html Other tracing tools like bpftrace, bcc would have similar issues. The current patch ================= The proposal here is for user specified address_space, just add it to DebugInfo and then later it will be automatically inserted into dwarf. For example, -bash-4.4$ cat t.c #define __user __attribute__((noderef, address_space(3))) void __user *g; extern int __user *foo(int *a, int __user *b); int __user *foo(int *a, int __user *b) { return b; } -bash-4.4$ clang -O2 -g -c t.c -bash-4.4$ llvm-dwarfdump t.o ... 0x0000002a: DW_TAG_variable DW_AT_name ("g") DW_AT_type (0x00000042 "*") 0x00000042: DW_TAG_pointer_type DW_AT_address_class (0x00000003) 0x00000060: DW_TAG_formal_parameter DW_AT_name ("a") DW_AT_type (0x00000091 "int*") 0x00000071: DW_TAG_formal_parameter DW_AT_name ("b") DW_AT_type (0x00000081 "int*") 0x00000081: DW_TAG_pointer_type DW_AT_type (0x0000008a "int") DW_AT_address_class (0x00000003) 0x00000091: DW_TAG_pointer_type DW_AT_type (0x0000008a "int") DW_AT_address_class (0x00000000) This patch mixed language address space and user defined address space in the same debuginfo address_space and in the dwarf final encoding, it is encoded as address_class which is more tailored into language address_space. Question: ========= This patch probably won't work as it mixed language address_space and user address_space. How we should proceed from here? Separate field in IR DebugInfo and Dwarf for user defined address_space? Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D69393 Files: clang/lib/Basic/Targets/BPF.h clang/lib/Basic/Targets/X86.h Index: clang/lib/Basic/Targets/X86.h =================================================================== --- clang/lib/Basic/Targets/X86.h +++ clang/lib/Basic/Targets/X86.h @@ -257,6 +257,11 @@ setFeatureEnabledImpl(Features, Name, Enabled); } + Optional<unsigned> + getDWARFAddressSpace(unsigned AddressSpace) const override { + return AddressSpace; + } + // This exists purely to cut down on the number of virtual calls in // initFeatureMap which calls this repeatedly. static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features, Index: clang/lib/Basic/Targets/BPF.h =================================================================== --- clang/lib/Basic/Targets/BPF.h +++ clang/lib/Basic/Targets/BPF.h @@ -58,6 +58,11 @@ ArrayRef<Builtin::Info> getTargetBuiltins() const override; + Optional<unsigned> + getDWARFAddressSpace(unsigned AddressSpace) const override { + return AddressSpace; + } + const char *getClobbers() const override { return ""; } BuiltinVaListKind getBuiltinVaListKind() const override {
Index: clang/lib/Basic/Targets/X86.h =================================================================== --- clang/lib/Basic/Targets/X86.h +++ clang/lib/Basic/Targets/X86.h @@ -257,6 +257,11 @@ setFeatureEnabledImpl(Features, Name, Enabled); } + Optional<unsigned> + getDWARFAddressSpace(unsigned AddressSpace) const override { + return AddressSpace; + } + // This exists purely to cut down on the number of virtual calls in // initFeatureMap which calls this repeatedly. static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features, Index: clang/lib/Basic/Targets/BPF.h =================================================================== --- clang/lib/Basic/Targets/BPF.h +++ clang/lib/Basic/Targets/BPF.h @@ -58,6 +58,11 @@ ArrayRef<Builtin::Info> getTargetBuiltins() const override; + Optional<unsigned> + getDWARFAddressSpace(unsigned AddressSpace) const override { + return AddressSpace; + } + const char *getClobbers() const override { return ""; } BuiltinVaListKind getBuiltinVaListKind() const override {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits