[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