Skip to content

Commit

Permalink
[CIR][CIRGen] More on dsolocal: visibility improvements (#735)
Browse files Browse the repository at this point in the history
In this PR, we 
1. implement defaultVisibility as far as dsolocal is concerned,
currently is either MLIR::Visibility isPublic() or isPrivate(). Now, we
don't handle hiddenVisibility and protectedVisibility from AST. I put
missFeature assert so that If in anyway we translate hiddenVisibility or
protectedVisibility into mlir::SymbolTable::Visibility::Private
(hopefully not for it'd be confusing), then we need to revise this
defaultVisibility setting.
2. call setNonAliasAttributes on global op upon discovery of its
initialization, thus we have globals dso_local correctly set.

Still missing is lots of function should have dso_local set, but the all
depend on comDat implementation, which will come from next PR within the
next few days.
  • Loading branch information
ghehg authored Jul 12, 2024
1 parent d6005d1 commit 5d9732a
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 11 deletions.
2 changes: 1 addition & 1 deletion clang/lib/CIR/CodeGen/CIRGenCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ mlir::cir::FuncOp CIRGenModule::codegenCXXStructor(GlobalDecl GD) {
}
CurCGF = nullptr;

// TODO: setNonAliasAttributes
setNonAliasAttributes(GD, Fn);
// TODO: SetLLVMFunctionAttributesForDefinition
return Fn;
}
Expand Down
13 changes: 8 additions & 5 deletions clang/lib/CIR/CodeGen/CIRGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -365,10 +365,13 @@ bool CIRGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
}

static bool hasDefaultVisibility(CIRGlobalValueInterface GV) {
// TODO: we need to have a precise definition of what is a default visibility.
// in the context of MILR and CIR, now we default to
assert(!MissingFeatures::setDefaultVisibility());
return true;
// Since we do not support hidden visibility and private visibility,
// we can assume that the default visibility is public or private.
// The way we use private visibility now simply is just treating it
// as either local or private linkage, or just default for declarations
assert(!MissingFeatures::hiddenVisibility());
assert(!MissingFeatures::protectedVisibility());
return GV.isPublic() || GV.isPrivate();
}

static bool shouldAssumeDSOLocal(const CIRGenModule &CGM,
Expand Down Expand Up @@ -1291,7 +1294,7 @@ void CIRGenModule::buildGlobalVarDefinition(const clang::VarDecl *D,
GV.setLinkage(mlir::cir::GlobalLinkageKind::WeakAnyLinkage);
}

// TODO(cir): setNonAliasAttributes(D, GV);
setNonAliasAttributes(D, GV);

if (D->getTLSKind() && !GV.getTlsModelAttr()) {
if (D->getTLSKind() == VarDecl::TLS_Dynamic)
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CIR/CodeGen/linkage.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ int foo(void) {
// LLVM: define i32 @foo(

static int var = 0;
// CIR: cir.global "private" internal @var = #cir.int<0> : !s32i
// CIR: cir.global "private" internal dsolocal @var = #cir.int<0> : !s32i
int get_var(void) {
return var;
}
Expand Down
8 changes: 4 additions & 4 deletions clang/test/CIR/CodeGen/static.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ static Init __ioinit2(false);
// BEFORE: module {{.*}} {
// BEFORE-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_22Init22>, !cir.bool)
// BEFORE-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_22Init22>)
// BEFORE-NEXT: cir.global "private" internal @_ZL8__ioinit = ctor : !ty_22Init22 {
// BEFORE-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = ctor : !ty_22Init22 {
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
// BEFORE-NEXT: %1 = cir.const #true
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_22Init22>, !cir.bool) -> ()
// BEFORE-NEXT: } dtor {
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
// BEFORE-NEXT: cir.call @_ZN4InitD1Ev(%0) : (!cir.ptr<!ty_22Init22>) -> ()
// BEFORE-NEXT: } {ast = #cir.var.decl.ast}
// BEFORE: cir.global "private" internal @_ZL9__ioinit2 = ctor : !ty_22Init22 {
// BEFORE: cir.global "private" internal dsolocal @_ZL9__ioinit2 = ctor : !ty_22Init22 {
// BEFORE-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_22Init22>
// BEFORE-NEXT: %1 = cir.const #false
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_22Init22>, !cir.bool) -> ()
Expand All @@ -43,7 +43,7 @@ static Init __ioinit2(false);
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_22Init22>, !cir.bool)
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_22Init22>)
// AFTER-NEXT: cir.global "private" internal @_ZL8__ioinit = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
// AFTER-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init()
// AFTER-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
// AFTER-NEXT: %1 = cir.const #true
Expand All @@ -55,7 +55,7 @@ static Init __ioinit2(false);
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
// AFTER-NEXT: cir.return
// AFTER: cir.global "private" internal @_ZL9__ioinit2 = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
// AFTER: cir.global "private" internal dsolocal @_ZL9__ioinit2 = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init.1()
// AFTER-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_22Init22>
// AFTER-NEXT: %1 = cir.const #false
Expand Down

0 comments on commit 5d9732a

Please sign in to comment.