[clang] 7191232 - clang: Fix another assert from not respecting function address spaces

Matt Arsenault via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 21 05:27:30 PST 2022


Author: Matt Arsenault
Date: 2022-12-21T08:27:24-05:00
New Revision: 719123230577ebfb689b53ed09f4d06ddc1664ef

URL: https://github.com/llvm/llvm-project/commit/719123230577ebfb689b53ed09f4d06ddc1664ef
DIFF: https://github.com/llvm/llvm-project/commit/719123230577ebfb689b53ed09f4d06ddc1664ef.diff

LOG: clang: Fix another assert from not respecting function address spaces

Added: 
    clang/test/CodeGen/incomplete-function-type-function-addrspace.c

Modified: 
    clang/lib/CodeGen/CodeGenModule.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 50e2f5bf212e..ac71346de298 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -4120,8 +4120,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
     return F;
   }
 
-  llvm::Type *PTy = llvm::PointerType::getUnqual(Ty);
-  return llvm::ConstantExpr::getBitCast(F, PTy);
+  return llvm::ConstantExpr::getBitCast(F,
+                                        Ty->getPointerTo(F->getAddressSpace()));
 }
 
 /// GetAddrOfFunction - Return the address of the given function.  If Ty is

diff  --git a/clang/test/CodeGen/incomplete-function-type-function-addrspace.c b/clang/test/CodeGen/incomplete-function-type-function-addrspace.c
new file mode 100644
index 000000000000..cce6059d7fe1
--- /dev/null
+++ b/clang/test/CodeGen/incomplete-function-type-function-addrspace.c
@@ -0,0 +1,37 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature
+// REQUIRES: avr-registered-target
+// RUN: %clang_cc1 -triple avr-- -emit-llvm -o - %s | FileCheck %s
+
+// Copy of incomplete-function-type-2.c run with AVR.
+
+// Make sure the address space of the function is respected for incomplete
+// functions.
+
+struct test10_B;
+typedef struct test10_B test10_F3(double);
+void test10_foo(test10_F3 p1);
+struct test10_B test10_b(double);
+// CHECK-LABEL: define {{[^@]+}}@test10_bar
+// CHECK-SAME: () addrspace(1) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    call addrspace(1) void @test10_foo(ptr addrspace(1) noundef @test10_b)
+// CHECK-NEXT:    ret void
+//
+void test10_bar(void) {
+  test10_foo(test10_b);
+}
+struct test10_B {};
+// CHECK-LABEL: define {{[^@]+}}@test10_foo
+// CHECK-SAME: (ptr addrspace(1) noundef [[P1:%.*]]) addrspace(1) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[P1_ADDR:%.*]] = alloca ptr addrspace(1), align 1
+// CHECK-NEXT:    [[AGG_TMP:%.*]] = alloca [[STRUCT_TEST10_B:%.*]], align 1
+// CHECK-NEXT:    store ptr addrspace(1) [[P1]], ptr [[P1_ADDR]], align 1
+// CHECK-NEXT:    [[TMP0:%.*]] = load ptr addrspace(1), ptr [[P1_ADDR]], align 1
+// CHECK-NEXT:    [[CALL:%.*]] = call addrspace(1) [[STRUCT_TEST10_B]] [[TMP0]](float noundef 0.000000e+00)
+// CHECK-NEXT:    ret void
+//
+void test10_foo(test10_F3 p1)
+{
+  p1(0.0);
+}


        


More information about the cfe-commits mailing list