[PATCH] D126361: [DebugInfo][ARM] Not readonly check for RWPI globals

Keith Walker via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 02:35:43 PDT 2022


keith.walker.arm created this revision.
keith.walker.arm added reviewers: labrinea, dblaikie, aprantl.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: All.
keith.walker.arm requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

When compiling for the RWPI relocation model [1], the debug information is wrong for readonly global variables.

Writable global variables are accessed by the static base register (R9 <https://reviews.llvm.org/source/libcxxabi/> on ARM) in the RWPI relocation model.  This is being correctly generated

Readonly global variables are not accessed by the static base register in the RWPI relocation model. This case is incorrectly generating the same debugging information as for writable global variables.

References:
[1] ARM Read-Write Position Independence: https://github.com/ARM-software/abi-aa/blob/main/aapcs32/aapcs32.rst#read-write-position-independence-rwpi


https://reviews.llvm.org/D126361

Files:
  llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
  llvm/test/DebugInfo/ARM/ropi.ll


Index: llvm/test/DebugInfo/ARM/ropi.ll
===================================================================
--- /dev/null
+++ llvm/test/DebugInfo/ARM/ropi.ll
@@ -0,0 +1,37 @@
+; RUN: llc -mtriple armv7-linux -relocation-model=ropi -o - %s | FileCheck %s
+; RUN: llc -mtriple armv7-linux -relocation-model=ropi-rwpi -o - %s | FileCheck %s
+
+ at global = constant i32 -1414812757, align 4, !dbg !0
+
+; CHECK:        .section        .debug_info
+; CHECK:        .byte 2 @ DW_AT_location
+; DW_OP_addrx 0x0
+; CHECK-NEXT:   .byte 161
+; CHECK-NEXT:   .byte 0
+
+; CHECK:        .section        .debug_addr
+; CHECK:        .long   global
+
+!llvm.dbg.cu = !{!2}
+!llvm.module.flags = !{!8, !9, !10, !11, !12, !13, !14, !15, !16}
+!llvm.ident = !{!17}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "global", scope: !2, file: !5, line: 1, type: !6, isLocal: false, isDefinition: true)
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 15.0.0 (https://github.com/llvm/llvm-project.git 3948962b454022c2c8de6f67942a9cbd1f0351a0)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None)
+!3 = !DIFile(filename: "/tmp/ropi.c", directory: "/tmp")
+!4 = !{!0}
+!5 = !DIFile(filename: "ropi.c", directory: "/tmp")
+!6 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !7)
+!7 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
+!8 = !{i32 7, !"Dwarf Version", i32 5}
+!9 = !{i32 2, !"Debug Info Version", i32 3}
+!10 = !{i32 1, !"wchar_size", i32 4}
+!11 = !{i32 1, !"min_enum_size", i32 4}
+!12 = !{i32 8, !"branch-target-enforcement", i32 0}
+!13 = !{i32 8, !"sign-return-address", i32 0}
+!14 = !{i32 8, !"sign-return-address-all", i32 0}
+!15 = !{i32 8, !"sign-return-address-with-bkey", i32 0}
+!16 = !{i32 7, !"frame-pointer", i32 2}
+!17 = !{!"clang version 15.0.0 (https://github.com/llvm/llvm-project.git 3948962b454022c2c8de6f67942a9cbd1f0351a0)"}
+
Index: llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -301,8 +301,11 @@
                   DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
                                         : dwarf::DW_OP_form_tls_address);
         }
-      } else if (Asm->TM.getRelocationModel() == Reloc::RWPI ||
-                 Asm->TM.getRelocationModel() == Reloc::ROPI_RWPI) {
+      } else if ((Asm->TM.getRelocationModel() == Reloc::RWPI ||
+                  Asm->TM.getRelocationModel() == Reloc::ROPI_RWPI) &&
+                 !Asm->getObjFileLowering()
+                      .getKindForGlobal(Global, Asm->TM)
+                      .isReadOnly()) {
         auto FormAndOp = GetPointerSizedFormAndOp();
         // Constant
         addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D126361.431918.patch
Type: text/x-patch
Size: 3002 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220525/e7b0744f/attachment.bin>


More information about the llvm-commits mailing list