https://github.com/jwnrt created
https://github.com/llvm/llvm-project/pull/134254
AVR uses separate address spaces for data (0) and program (1) memory, however
pointer layout is only defined for address space 0 in the data layout string.
The `p[n]` directive defines pointer layouts where `n` defaults to `0`. When
pointer layout is unspecified it defaults to `p[n]:64:64:64`. ([data layout
reference](https://llvm.org/docs/LangRef.html#data-layout))
AVR uses 16-bit pointers for both data and program memory (e.g. for function
pointers):
https://onlinedocs.microchip.com/oxy/GUID-BD1C16C8-7FA3-4D73-A4BE-241EE05EF592-en-US-7/GUID-5F57457F-3E41-400A-B56C-432188906974.html
> Function pointers are 2 bytes in size.
>From 9f5f98dd9e4ab59faa8c54165dd30634f8a97b1c Mon Sep 17 00:00:00 2001
From: James Wainwright
Date: Thu, 3 Apr 2025 15:19:10 +0100
Subject: [PATCH] Define pointer layout for AVR program address space
AVR uses separate address spaces for data (0) and program (1) memory,
however pointer layout is only defined for address space 0 in the data
layout string.
The `p[n]` directive defines pointer layouts where `n` defaults to `0`.
When pointer layout is unspecified it defaults to `p[n]:64:64:64`.
AVR uses 16-bit pointers for both data and program memory (e.g. for
function pointers).
---
clang/lib/Basic/Targets/AVR.h | 3 ++-
llvm/lib/Target/AVR/AVRTargetMachine.cpp | 2 +-
llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll | 2 +-
llvm/test/CodeGen/AVR/shift-expand.ll | 2 +-
.../Transforms/ArgumentPromotion/nonzero-address-spaces.ll | 2 +-
.../Attributor/ArgumentPromotion/nonzero-address-spaces.ll | 2 +-
llvm/test/Transforms/DeadArgElim/nonzero-address-spaces.ll | 2 +-
7 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h
index 2117ab58e6f30..301d405adba7e 100644
--- a/clang/lib/Basic/Targets/AVR.h
+++ b/clang/lib/Basic/Targets/AVR.h
@@ -57,7 +57,8 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public
TargetInfo {
Int16Type = SignedInt;
Char32Type = UnsignedLong;
SigAtomicType = SignedChar;
-resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
+resetDataLayout(
+"e-P1-p0:16:8-p1:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
}
void getTargetDefines(const LangOptions &Opts,
diff --git a/llvm/lib/Target/AVR/AVRTargetMachine.cpp
b/llvm/lib/Target/AVR/AVRTargetMachine.cpp
index 579f7ac712313..915c5848a2d79 100644
--- a/llvm/lib/Target/AVR/AVRTargetMachine.cpp
+++ b/llvm/lib/Target/AVR/AVRTargetMachine.cpp
@@ -27,7 +27,7 @@
namespace llvm {
static const char *AVRDataLayout =
-"e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8";
+"e-P1-p0:16:8-p1:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8";
/// Processes a CPU name.
static StringRef getCPU(StringRef CPU) {
diff --git a/llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll
b/llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll
index 6444c5c30fbe2..fdf9eb39b2a10 100644
--- a/llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll
+++ b/llvm/test/CodeGen/AVR/block-address-is-in-progmem-space.ll
@@ -11,7 +11,7 @@
; This would cause a load of uninitialized memory, not even
; touching the program's machine code as otherwise desired.
-target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
+target datalayout =
"e-P1-p0:16:8-p1:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
; CHECK-LABEL: load_with_no_forward_reference
define i8 @load_with_no_forward_reference(i8 %a, i8 %b) {
diff --git a/llvm/test/CodeGen/AVR/shift-expand.ll
b/llvm/test/CodeGen/AVR/shift-expand.ll
index be075e5d30394..fb5b5a14c66c8 100644
--- a/llvm/test/CodeGen/AVR/shift-expand.ll
+++ b/llvm/test/CodeGen/AVR/shift-expand.ll
@@ -5,7 +5,7 @@
; amount to a loop. These loops avoid generating a (non-existing) builtin such
; as __ashlsi3.
-target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
+target datalayout =
"e-P1-p0:16:8-p1:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
target triple = "avr"
define i16 @shl16(i16 %value, i16 %amount) addrspace(1) {
diff --git a/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
b/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
index 6cabc5bb8f3a9..f56097fbd6deb 100644
--- a/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
+++ b/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
@@ -4,7 +4,7 @@
; ArgumentPromotion should preserve the default function address space
; from the data layout.
-target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
+target datalayout =
"e-P1-p0:16:8-p1:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
@g = common global i32 0, align 4
diff --git
a/llvm/test/Transforms/Attributor/ArgumentPromotion/no