summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGException.cpp
diff options
context:
space:
mode:
authorDylan McKay <me@dylanmckay.io>2018-11-09 19:42:05 +0000
committerDylan McKay <me@dylanmckay.io>2018-11-09 19:42:05 +0000
commit02bbe41f54e2192c4767d079a967b7774aafa3c1 (patch)
treeb9f2dc765e8ad8b011bb41b7c7d96aa705a5afc6 /clang/lib/CodeGen/CGException.cpp
parentac77dcd764f42d3635b5974dd954d51227bdcc20 (diff)
downloadbcm5719-llvm-02bbe41f54e2192c4767d079a967b7774aafa3c1.tar.gz
bcm5719-llvm-02bbe41f54e2192c4767d079a967b7774aafa3c1.zip
Use the correct address space when bitcasting func pointer to int pointer
When we cast a function pointer to an int pointer, at some pointer later it gets bitcasted back to a function and called. In backends that have a nonzero program memory address space specified in the data layout, the old code would lose the address space data. When LLVM later attempted to generate the bitcast from i8* to i8(..)* addrspace(1), it would fail because the pointers are not in the same address space. With this patch, the address space of the function will carry on to the address space of the i8* pointer. This is because all function pointers in Harvard architectures need to be assigned to the correct address space. This has no effect to any in-tree backends except AVR. llvm-svn: 346548
Diffstat (limited to 'clang/lib/CodeGen/CGException.cpp')
-rw-r--r--clang/lib/CodeGen/CGException.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp
index e77d0988dc6..10b68e41f01 100644
--- a/clang/lib/CodeGen/CGException.cpp
+++ b/clang/lib/CodeGen/CGException.cpp
@@ -250,7 +250,11 @@ static llvm::Constant *getPersonalityFn(CodeGenModule &CGM,
static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM,
const EHPersonality &Personality) {
llvm::Constant *Fn = getPersonalityFn(CGM, Personality);
- return llvm::ConstantExpr::getBitCast(Fn, CGM.Int8PtrTy);
+ llvm::PointerType* Int8PtrTy = llvm::PointerType::get(
+ llvm::Type::getInt8Ty(CGM.getLLVMContext()),
+ CGM.getDataLayout().getProgramAddressSpace());
+
+ return llvm::ConstantExpr::getBitCast(Fn, Int8PtrTy);
}
/// Check whether a landingpad instruction only uses C++ features.
OpenPOWER on IntegriCloud