From 719123230577ebfb689b53ed09f4d06ddc1664ef Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 21 Dec 2022 07:57:49 -0500 Subject: [PATCH] clang: Fix another assert from not respecting function address spaces --- clang/lib/CodeGen/CodeGenModule.cpp | 4 +-- .../incomplete-function-type-function-addrspace.c | 37 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGen/incomplete-function-type-function-addrspace.c diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 50e2f5b..ac71346 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 0000000..cce6059 --- /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); +} -- 2.7.4