[clang] 84ef723 - [clang] Fix wrong ABI of AVRTiny.
Ben Shi via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 16 16:39:15 PST 2022
Author: Ben Shi
Date: 2022-11-17T08:38:44+08:00
New Revision: 84ef7235732896530564289c8db59291a7d5413e
URL: https://github.com/llvm/llvm-project/commit/84ef7235732896530564289c8db59291a7d5413e
DIFF: https://github.com/llvm/llvm-project/commit/84ef7235732896530564289c8db59291a7d5413e.diff
LOG: [clang] Fix wrong ABI of AVRTiny.
A scalar which exceeds 4 bytes should be returned via a stack slot,
on an AVRTiny device.
Reviewed By: aykevl
Differential Revision: https://reviews.llvm.org/D138125
Added:
clang/test/CodeGen/avr/return-value.c
Modified:
clang/lib/CodeGen/TargetInfo.cpp
Removed:
clang/test/CodeGen/avr/struct.c
################################################################################
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index c57b0ddac75ad..fb6eb4aba60fc 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -8339,15 +8339,16 @@ class AVRABIInfo : public DefaultABIInfo {
: DefaultABIInfo(CGT), ParamRegs(NPR), RetRegs(NRR) {}
ABIArgInfo classifyReturnType(QualType Ty, bool &LargeRet) const {
- if (isAggregateTypeForABI(Ty)) {
- // On AVR, a return struct with size less than or equals to 8 bytes is
- // returned directly via registers R18-R25. On AVRTiny, a return struct
- // with size less than or equals to 4 bytes is returned directly via
- // registers R22-R25.
- if (getContext().getTypeSize(Ty) <= RetRegs * 8)
- return ABIArgInfo::getDirect();
- // A return struct with larger size is returned via a stack
- // slot, along with a pointer to it as the function's implicit argument.
+ // On AVR, a return struct with size less than or equals to 8 bytes is
+ // returned directly via registers R18-R25. On AVRTiny, a return struct
+ // with size less than or equals to 4 bytes is returned directly via
+ // registers R22-R25.
+ if (isAggregateTypeForABI(Ty) &&
+ getContext().getTypeSize(Ty) <= RetRegs * 8)
+ return ABIArgInfo::getDirect();
+ // A return value (struct or scalar) with larger size is returned via a
+ // stack slot, along with a pointer as the function's implicit argument.
+ if (getContext().getTypeSize(Ty) > RetRegs * 8) {
LargeRet = true;
return getNaturalAlignIndirect(Ty);
}
diff --git a/clang/test/CodeGen/avr/struct.c b/clang/test/CodeGen/avr/return-value.c
similarity index 92%
rename from clang/test/CodeGen/avr/struct.c
rename to clang/test/CodeGen/avr/return-value.c
index dcd7d7a49f513..535bf8f3a4e9e 100644
--- a/clang/test/CodeGen/avr/struct.c
+++ b/clang/test/CodeGen/avr/return-value.c
@@ -33,12 +33,17 @@ struct s04 foo04(int a, int b) {
return a0;
}
+long long fooi64(void) {
+ return 0xaa5533;
+}
+
// AVR: %struct.s10 = type { i16, i16, i16, i16, i16 }
// AVR: %struct.s06 = type { i16, i16, i16 }
// AVR: %struct.s04 = type { i16, i16 }
// AVR: define{{.*}} void @foo10(ptr {{.*}}, i16 noundef %a, i16 noundef %b, i16 noundef %c)
// AVR: define{{.*}} %struct.s06 @foo06(i16 noundef %a, i16 noundef %b, i16 noundef %c)
// AVR: define{{.*}} %struct.s04 @foo04(i16 noundef %a, i16 noundef %b)
+// AVR: define{{.*}} i64 @fooi64()
// TINY: %struct.s10 = type { i16, i16, i16, i16, i16 }
// TINY: %struct.s06 = type { i16, i16, i16 }
@@ -46,3 +51,4 @@ struct s04 foo04(int a, int b) {
// TINY: define{{.*}} void @foo10(ptr {{.*}}, i16 noundef %a, i16 noundef %b, i16 noundef %c)
// TINY: define{{.*}} void @foo06(ptr {{.*}}, i16 noundef %a, i16 noundef %b, i16 noundef %c)
// TINY: define{{.*}} %struct.s04 @foo04(i16 noundef %a, i16 noundef %b)
+// TINY: define{{.*}} void @fooi64(ptr {{.*}})
More information about the cfe-commits
mailing list