Skip to content

Commit 5d9732a

Browse files
authored
[CIR][CIRGen] More on dsolocal: visibility improvements (#735)
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.
1 parent d6005d1 commit 5d9732a

File tree

4 files changed

+14
-11
lines changed

4 files changed

+14
-11
lines changed

clang/lib/CIR/CodeGen/CIRGenCXX.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ mlir::cir::FuncOp CIRGenModule::codegenCXXStructor(GlobalDecl GD) {
253253
}
254254
CurCGF = nullptr;
255255

256-
// TODO: setNonAliasAttributes
256+
setNonAliasAttributes(GD, Fn);
257257
// TODO: SetLLVMFunctionAttributesForDefinition
258258
return Fn;
259259
}

clang/lib/CIR/CodeGen/CIRGenModule.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,13 @@ bool CIRGenModule::MayBeEmittedEagerly(const ValueDecl *Global) {
365365
}
366366

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

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

1294-
// TODO(cir): setNonAliasAttributes(D, GV);
1297+
setNonAliasAttributes(D, GV);
12951298

12961299
if (D->getTLSKind() && !GV.getTlsModelAttr()) {
12971300
if (D->getTLSKind() == VarDecl::TLS_Dynamic)

clang/test/CIR/CodeGen/linkage.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ int foo(void) {
1919
// LLVM: define i32 @foo(
2020

2121
static int var = 0;
22-
// CIR: cir.global "private" internal @var = #cir.int<0> : !s32i
22+
// CIR: cir.global "private" internal dsolocal @var = #cir.int<0> : !s32i
2323
int get_var(void) {
2424
return var;
2525
}

clang/test/CIR/CodeGen/static.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ static Init __ioinit2(false);
1919
// BEFORE: module {{.*}} {
2020
// BEFORE-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_22Init22>, !cir.bool)
2121
// BEFORE-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_22Init22>)
22-
// BEFORE-NEXT: cir.global "private" internal @_ZL8__ioinit = ctor : !ty_22Init22 {
22+
// BEFORE-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = ctor : !ty_22Init22 {
2323
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
2424
// BEFORE-NEXT: %1 = cir.const #true
2525
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_22Init22>, !cir.bool) -> ()
2626
// BEFORE-NEXT: } dtor {
2727
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
2828
// BEFORE-NEXT: cir.call @_ZN4InitD1Ev(%0) : (!cir.ptr<!ty_22Init22>) -> ()
2929
// BEFORE-NEXT: } {ast = #cir.var.decl.ast}
30-
// BEFORE: cir.global "private" internal @_ZL9__ioinit2 = ctor : !ty_22Init22 {
30+
// BEFORE: cir.global "private" internal dsolocal @_ZL9__ioinit2 = ctor : !ty_22Init22 {
3131
// BEFORE-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_22Init22>
3232
// BEFORE-NEXT: %1 = cir.const #false
3333
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_22Init22>, !cir.bool) -> ()
@@ -43,7 +43,7 @@ static Init __ioinit2(false);
4343
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
4444
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_22Init22>, !cir.bool)
4545
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_22Init22>)
46-
// AFTER-NEXT: cir.global "private" internal @_ZL8__ioinit = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
46+
// AFTER-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
4747
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init()
4848
// AFTER-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_22Init22>
4949
// AFTER-NEXT: %1 = cir.const #true
@@ -55,7 +55,7 @@ static Init __ioinit2(false);
5555
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
5656
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
5757
// AFTER-NEXT: cir.return
58-
// AFTER: cir.global "private" internal @_ZL9__ioinit2 = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
58+
// AFTER: cir.global "private" internal dsolocal @_ZL9__ioinit2 = #cir.zero : !ty_22Init22 {ast = #cir.var.decl.ast}
5959
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init.1()
6060
// AFTER-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_22Init22>
6161
// AFTER-NEXT: %1 = cir.const #false

0 commit comments

Comments
 (0)