diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -9221,6 +9221,32 @@ public: SparcV8TargetCodeGenInfo(CodeGenTypes &CGT) : TargetCodeGenInfo(std::make_unique(CGT)) {} + + llvm::Value *decodeReturnAddress(CodeGen::CodeGenFunction &CGF, + llvm::Value *Address) const override { + llvm::Value *AddrAsInt = Address; + AddrAsInt = CGF.Builder.CreatePtrToInt(AddrAsInt, CGF.IntPtrTy); + AddrAsInt = CGF.Builder.CreateAdd(AddrAsInt, + llvm::ConstantInt::get(CGF.IntPtrTy, 8)); + if (isAggregateTypeForABI(CGF.CurFnInfo->getReturnType())) + AddrAsInt = CGF.Builder.CreateAdd( + AddrAsInt, llvm::ConstantInt::get(CGF.IntPtrTy, 4)); + AddrAsInt = CGF.Builder.CreateIntToPtr(AddrAsInt, Address->getType()); + return AddrAsInt; + } + + llvm::Value *encodeReturnAddress(CodeGen::CodeGenFunction &CGF, + llvm::Value *Address) const override { + llvm::Value *AddrAsInt = Address; + AddrAsInt = CGF.Builder.CreatePtrToInt(AddrAsInt, CGF.IntPtrTy); + AddrAsInt = CGF.Builder.CreateAdd(AddrAsInt, + llvm::ConstantInt::get(CGF.IntPtrTy, -8)); + if (isAggregateTypeForABI(CGF.CurFnInfo->getReturnType())) + AddrAsInt = CGF.Builder.CreateAdd( + AddrAsInt, llvm::ConstantInt::get(CGF.IntPtrTy, -4)); + AddrAsInt = CGF.Builder.CreateIntToPtr(AddrAsInt, Address->getType()); + return AddrAsInt; + } }; } // end anonymous namespace @@ -9495,6 +9521,26 @@ bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const override; + + llvm::Value *decodeReturnAddress(CodeGen::CodeGenFunction &CGF, + llvm::Value *Address) const override { + llvm::Value *AddrAsInt = Address; + AddrAsInt = CGF.Builder.CreatePtrToInt(AddrAsInt, CGF.IntPtrTy); + AddrAsInt = CGF.Builder.CreateAdd(AddrAsInt, + llvm::ConstantInt::get(CGF.IntPtrTy, 8)); + AddrAsInt = CGF.Builder.CreateIntToPtr(AddrAsInt, Address->getType()); + return AddrAsInt; + } + + llvm::Value *encodeReturnAddress(CodeGen::CodeGenFunction &CGF, + llvm::Value *Address) const override { + llvm::Value *AddrAsInt = Address; + AddrAsInt = CGF.Builder.CreatePtrToInt(AddrAsInt, CGF.IntPtrTy); + AddrAsInt = CGF.Builder.CreateAdd(AddrAsInt, + llvm::ConstantInt::get(CGF.IntPtrTy, -8)); + AddrAsInt = CGF.Builder.CreateIntToPtr(AddrAsInt, Address->getType()); + return AddrAsInt; + } }; } // end anonymous namespace