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
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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits