[OPENMP][NVPTX]Fix PR40893: Size doesn't match for

'_openmp_teams_reductions_buffer_$_.

nvlink does not handle weak linkage correctly, same symbols with the
different sizes are reported as erroneous though the largest size must
be chosen instead. Patch fixes this problem by using Internal linkage
instead of the Common.

llvm-svn: 356072
This commit is contained in:
Alexey Bataev 2019-03-13 18:21:10 +00:00
parent 510f26dca8
commit 7b3eabdcd2
2 changed files with 9 additions and 3 deletions

View File

@ -5050,9 +5050,12 @@ void CGOpenMPRuntimeNVPTX::clear() {
QualType Arr2Ty = C.getConstantArrayType(Arr1Ty, Size2, ArrayType::Normal, QualType Arr2Ty = C.getConstantArrayType(Arr1Ty, Size2, ArrayType::Normal,
/*IndexTypeQuals=*/0); /*IndexTypeQuals=*/0);
llvm::Type *LLVMArr2Ty = CGM.getTypes().ConvertTypeForMem(Arr2Ty); llvm::Type *LLVMArr2Ty = CGM.getTypes().ConvertTypeForMem(Arr2Ty);
// FIXME: nvlink does not handle weak linkage correctly (object with the
// different size are reported as erroneous).
// Restore CommonLinkage as soon as nvlink is fixed.
auto *GV = new llvm::GlobalVariable( auto *GV = new llvm::GlobalVariable(
CGM.getModule(), LLVMArr2Ty, CGM.getModule(), LLVMArr2Ty,
/*isConstant=*/false, llvm::GlobalValue::CommonLinkage, /*isConstant=*/false, llvm::GlobalValue::InternalLinkage,
llvm::Constant::getNullValue(LLVMArr2Ty), llvm::Constant::getNullValue(LLVMArr2Ty),
"_openmp_static_glob_rd_$_"); "_openmp_static_glob_rd_$_");
auto *Replacement = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast( auto *Replacement = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
@ -5082,9 +5085,12 @@ void CGOpenMPRuntimeNVPTX::clear() {
QualType StaticTy = C.getRecordType(StaticRD); QualType StaticTy = C.getRecordType(StaticRD);
llvm::Type *LLVMReductionsBufferTy = llvm::Type *LLVMReductionsBufferTy =
CGM.getTypes().ConvertTypeForMem(StaticTy); CGM.getTypes().ConvertTypeForMem(StaticTy);
// FIXME: nvlink does not handle weak linkage correctly (object with the
// different size are reported as erroneous).
// Restore CommonLinkage as soon as nvlink is fixed.
auto *GV = new llvm::GlobalVariable( auto *GV = new llvm::GlobalVariable(
CGM.getModule(), LLVMReductionsBufferTy, CGM.getModule(), LLVMReductionsBufferTy,
/*isConstant=*/false, llvm::GlobalValue::CommonLinkage, /*isConstant=*/false, llvm::GlobalValue::InternalLinkage,
llvm::Constant::getNullValue(LLVMReductionsBufferTy), llvm::Constant::getNullValue(LLVMReductionsBufferTy),
"_openmp_teams_reductions_buffer_$_"); "_openmp_teams_reductions_buffer_$_");
KernelTeamsReductionPtr->setInitializer( KernelTeamsReductionPtr->setInitializer(

View File

@ -28,7 +28,7 @@
// CHECK-DAG: {{@__omp_offloading_.+l47}}_exec_mode = weak constant i8 1 // CHECK-DAG: {{@__omp_offloading_.+l47}}_exec_mode = weak constant i8 1
// CHECK-DAG: {{@__omp_offloading_.+l54}}_exec_mode = weak constant i8 0 // CHECK-DAG: {{@__omp_offloading_.+l54}}_exec_mode = weak constant i8 0
// CHECK-DAG: [[TEAMS_RED_BUFFER:@.+]] = common global [[TEAMS_REDUCE_UNION_TY]] zeroinitializer // CHECK-DAG: [[TEAMS_RED_BUFFER:@.+]] = internal global [[TEAMS_REDUCE_UNION_TY]] zeroinitializer
template<typename tx> template<typename tx>
tx ftemplate(int n) { tx ftemplate(int n) {