Skip to content

Commit

Permalink
[OpenMP] Fix setting visibility on declare target variables
Browse files Browse the repository at this point in the history
Summary:
A previous patch changed the logic to force external visibliity on
declare target variables. This is because they need to be exported in
the dynamic symbol table to be usable as the standard depicts. However,
the logic was always setting the visibility to `protected`, which would
override some symbols. For example, when calling `libc` functions for
CPU offloading. This patch changes the logic to only fire if the
variable has hidden visibliity to start with.
  • Loading branch information
jhuber6 committed Oct 9, 2023
1 parent bcf172e commit 85feb93
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 6 deletions.
10 changes: 6 additions & 4 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1391,21 +1391,23 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
if (!D)
return;

// Set visibility for definitions, and for declarations if requested globally
// or set explicitly.
LinkageInfo LV = D->getLinkageAndVisibility();

// OpenMP declare target variables must be visible to the host so they can
// be registered. We require protected visibility unless the variable has
// the DT_nohost modifier and does not need to be registered.
if (Context.getLangOpts().OpenMP &&
Context.getLangOpts().OpenMPIsTargetDevice && isa<VarDecl>(D) &&
D->hasAttr<OMPDeclareTargetDeclAttr>() &&
D->getAttr<OMPDeclareTargetDeclAttr>()->getDevType() !=
OMPDeclareTargetDeclAttr::DT_NoHost) {
OMPDeclareTargetDeclAttr::DT_NoHost &&
LV.getVisibility() == HiddenVisibility) {
GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
return;
}

// Set visibility for definitions, and for declarations if requested globally
// or set explicitly.
LinkageInfo LV = D->getLinkageAndVisibility();
if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) {
// Reject incompatible dlllstorage and visibility annotations.
if (!LV.isVisibilityExplicit())
Expand Down
2 changes: 1 addition & 1 deletion clang/test/OpenMP/declare_target_codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
// CHECK-DAG: @dy = {{protected | }}global i32 0,
// CHECK-DAG: @bbb = {{protected | }}global i32 0,
// CHECK-DAG: weak constant %struct.__tgt_offload_entry { ptr @bbb,
// CHECK-DAG: @ccc = external {{protected | }}global i32,
// CHECK-DAG: @ccc = external global i32,
// CHECK-DAG: @ddd = {{protected | }}global i32 0,
// CHECK-DAG: @hhh_decl_tgt_ref_ptr = weak global ptr null
// CHECK-DAG: @ggg_decl_tgt_ref_ptr = weak global ptr null
Expand Down
2 changes: 1 addition & 1 deletion clang/test/OpenMP/declare_target_constexpr_codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class A {
public:
static constexpr double pi = 3.141592653589793116;
//.
// CHECK: @_ZN1A2piE = linkonce_odr protected constant double 0x400921FB54442D18, comdat, align 8
// CHECK: @_ZN1A2piE = linkonce_odr constant double 0x400921FB54442D18, comdat, align 8
// CHECK: @_ZL9anotherPi = internal constant double 3.140000e+00, align 8
// CHECK: @llvm.compiler.used = appending global [2 x ptr] [ptr @"__ZN1A2piE$ref", ptr @"__ZL9anotherPi$ref"], section "llvm.metadata"
//.
Expand Down

0 comments on commit 85feb93

Please sign in to comment.