[PATCH] D138681: [AVR] Fix broken bitcast for aliases in non-zero address space

Ayke via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 24 11:35:04 PST 2022


aykevl created this revision.
aykevl added reviewers: benshi001, dylanmckay, rjmccall, MaskRay.
Herald added subscribers: jeroen.dobbelaere, StephenFan, Jim, arichardson.
Herald added a project: All.
aykevl requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This was triggered by some code in picolibc. The minimal version looks like this:

  double infinity(void) {
     return 5;
  }
  
  extern long double infinityl() __attribute__((__alias__("infinity")));

These two declarations have a different type (not because of the 'long double', which is also 'double' in IR, but because infinityl has no `(void)` and is therefore a variadic function). This led to a crash in the bitcast which assumed address space 0.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D138681

Files:
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/test/CodeGen/avr/alias-avr.c


Index: clang/test/CodeGen/avr/alias-avr.c
===================================================================
--- clang/test/CodeGen/avr/alias-avr.c
+++ clang/test/CodeGen/avr/alias-avr.c
@@ -6,3 +6,7 @@
 
 // CHECK: @multiply ={{.*}} alias i16 (i16, i16), ptr addrspace(1) @mul
 int multiply(int x, int y) __attribute__((alias("mul")));
+
+// Make sure the correct address space is used when creating an alias that needs
+// a pointer cast.
+char smallmul(int a, int b) __attribute__((alias("mul")));
Index: clang/lib/CodeGen/CodeGenModule.cpp
===================================================================
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -4002,7 +4002,8 @@
     // (If function is requested for a definition, we always need to create a new
     // function, not just return a bitcast.)
     if (!IsForDefinition)
-      return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo());
+      return llvm::ConstantExpr::getBitCast(
+          Entry, Ty->getPointerTo(Entry->getAddressSpace()));
   }
 
   // This function doesn't have a complete type (for example, the return


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138681.477826.patch
Type: text/x-patch
Size: 1134 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221124/7db90da6/attachment.bin>


More information about the cfe-commits mailing list