[llvm] 94fac09 - [DebugInfo][ARM] Not readonly check for RWPI globals

Keith Walker via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 15 03:52:43 PDT 2022


Author: Keith Walker
Date: 2022-06-15T11:52:12+01:00
New Revision: 94fac097ad409a5c48f9987f925794bf1d4eac21

URL: https://github.com/llvm/llvm-project/commit/94fac097ad409a5c48f9987f925794bf1d4eac21
DIFF: https://github.com/llvm/llvm-project/commit/94fac097ad409a5c48f9987f925794bf1d4eac21.diff

LOG: [DebugInfo][ARM] Not readonly check for RWPI globals

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
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

Differential Revision: https://reviews.llvm.org/D126361

Added: 
    llvm/test/DebugInfo/ARM/ropi.ll

Modified: 
    llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index b2095ae5d11d9..b3f99d346faa8 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -301,8 +301,11 @@ void DwarfCompileUnit::addLocationAttribute(
                   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);

diff  --git a/llvm/test/DebugInfo/ARM/ropi.ll b/llvm/test/DebugInfo/ARM/ropi.ll
new file mode 100644
index 0000000000000..662e11b16e0ec
--- /dev/null
+++ b/llvm/test/DebugInfo/ARM/ropi.ll
@@ -0,0 +1,29 @@
+; 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 = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "global", scope: !2, file: !3, line: 1, type: !5, 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: "ropi.c", directory: "/tmp")
+!4 = !{!0}
+!5 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !6)
+!6 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
+!7 = !{i32 7, !"Dwarf Version", i32 5}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 15.0.0 (https://github.com/llvm/llvm-project.git 3948962b454022c2c8de6f67942a9cbd1f0351a0)"}
+


        


More information about the llvm-commits mailing list