qianzhen updated this revision to Diff 529601. qianzhen added a comment. More examples have been identified for the adaptation of IBM XL compiler's -qstatsym option for the hot patch use case, which was mentioned previously. Therefore, this option is extended to cover the following cases.
1. Function-local static variables 2. Thread-local variables The test case is updated to add more coverage accordingly. Since the option is now covering not only the variables with static storage duration, but also those with thread storage duration, the option name is changed to -fkeep-persistent-storage-variables. Any suggestions would be appreciated. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150221/new/ https://reviews.llvm.org/D150221 Files: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/CGDecl.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/CodeGen/keep-persistent-storage-variables.cpp clang/test/Driver/fkeep-persistent-storage-variables.c
Index: clang/test/Driver/fkeep-persistent-storage-variables.c =================================================================== --- /dev/null +++ clang/test/Driver/fkeep-persistent-storage-variables.c @@ -0,0 +1,3 @@ +// RUN: %clang -fkeep-persistent-storage-variables -c %s -### 2>&1 | FileCheck %s + +// CHECK: "-fkeep-persistent-storage-variables" Index: clang/test/CodeGen/keep-persistent-storage-variables.cpp =================================================================== --- /dev/null +++ clang/test/CodeGen/keep-persistent-storage-variables.cpp @@ -0,0 +1,61 @@ +// RUN: %clang_cc1 -fkeep-persistent-storage-variables -emit-llvm %s -o - -triple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-ELF +// RUN: %clang_cc1 -fkeep-persistent-storage-variables -emit-llvm %s -o - -triple=powerpc64-ibm-aix-xcoff | FileCheck %s --check-prefixes=CHECK,CHECK-NON-ELF + +// CHECK: @_ZL2g1 = internal global i32 0, align 4 +// CHECK: @_ZL2g2 = internal global i32 1, align 4 +// CHECK: @_ZL2g3 = internal global i32 0, align 4 +// CHECK: @_ZL2g4 = internal global i32 2, align 4 +// CHECK: @tl1 = thread_local global i32 0, align 4 +// CHECK: @tl2 = thread_local global i32 3, align 4 +// CHECK: @_ZL3tl3 = internal thread_local global i32 0, align 4 +// CHECK: @_ZL3tl4 = internal thread_local global i32 4, align 4 +// CHECK: @g5 = global i32 0, align 4 +// CHECK: @g6 = global i32 6, align 4 +// CHECK: @_ZZ5test3vE2s3 = internal global i32 0, align 4 +// CHECK: @_ZN12_GLOBAL__N_12s4E = internal global i32 42, align 4 +// CHECK: @_ZZ5test5vE3tl5 = internal thread_local global i32 1, align 4 +// CHECK: @_ZN2ST2s6E = global i32 7, align 4 +// CHECK-ELF: @llvm.compiler.used = appending global [14 x ptr] [ptr @_ZL2g1, ptr @_ZL2g2, ptr @_ZL2g3, ptr @_ZL2g4, ptr @tl1, ptr @tl2, ptr @_ZL3tl3, ptr @_ZL3tl4, ptr @g5, ptr @g6, ptr @_ZZ5test3vE2s3, ptr @_ZN12_GLOBAL__N_12s4E, ptr @_ZZ5test5vE3tl5, ptr @_ZN2ST2s6E], section "llvm.metadata" +// CHECK-NON-ELF: @llvm.used = appending global [14 x ptr] [ptr @_ZL2g1, ptr @_ZL2g2, ptr @_ZL2g3, ptr @_ZL2g4, ptr @tl1, ptr @tl2, ptr @_ZL3tl3, ptr @_ZL3tl4, ptr @g5, ptr @g6, ptr @_ZZ5test3vE2s3, ptr @_ZN12_GLOBAL__N_12s4E, ptr @_ZZ5test5vE3tl5, ptr @_ZN2ST2s6E], section "llvm.metadata" + +static int g1; +static int g2 = 1; +static int g3; +static int g4 = 2; +__thread int tl1; +__thread int tl2 = 3; +static __thread int tl3; +static __thread int tl4 = 4; +int g5; +int g6 = 6; + +int test1() { + g1 = 3; + return g1; +} + +int test2() { + return g2; +} + +int test3() { + static int s3 = 0; + ++s3; + return s3; +} + +namespace { + int s4 = 42; +} +void *test4() { return &s4; } + +int test5() { + static __thread int tl5 = 1; + ++tl5; + return tl5; +} + +struct ST { + static int s6; +}; +int ST::s6 = 7; Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -7294,6 +7294,8 @@ Args.addOptInFlag(CmdArgs, options::OPT_fkeep_static_consts, options::OPT_fno_keep_static_consts); + Args.addOptInFlag(CmdArgs, options::OPT_fkeep_persistent_storage_variables, + options::OPT_fno_keep_persistent_storage_variables); Args.addOptInFlag(CmdArgs, options::OPT_fcomplete_member_pointers, options::OPT_fno_complete_member_pointers); Args.addOptOutFlag(CmdArgs, options::OPT_fcxx_static_destructors, Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -2198,12 +2198,14 @@ if (D && D->hasAttr<UsedAttr>()) addUsedOrCompilerUsedGlobal(GV); - if (CodeGenOpts.KeepStaticConsts && D && isa<VarDecl>(D)) { - const auto *VD = cast<VarDecl>(D); - if (VD->getType().isConstQualified() && - VD->getStorageDuration() == SD_Static) - addUsedOrCompilerUsedGlobal(GV); - } + if (const auto *VD = dyn_cast_if_present<VarDecl>(D); + VD && + ((CodeGenOpts.KeepPersistentStorageVariables && + (VD->getStorageDuration() == SD_Static || + VD->getStorageDuration() == SD_Thread)) || + (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() == SD_Static && + VD->getType().isConstQualified()))) + addUsedOrCompilerUsedGlobal(GV); } bool CodeGenModule::GetCPUAndFeaturesAttributes(GlobalDecl GD, @@ -3084,12 +3086,14 @@ if (LangOpts.EmitAllDecls) return true; - if (CodeGenOpts.KeepStaticConsts) { - const auto *VD = dyn_cast<VarDecl>(Global); - if (VD && VD->getType().isConstQualified() && - VD->getStorageDuration() == SD_Static) - return true; - } + const auto *VD = dyn_cast<VarDecl>(Global); + if (VD && + ((CodeGenOpts.KeepPersistentStorageVariables && + (VD->getStorageDuration() == SD_Static || + VD->getStorageDuration() == SD_Thread)) || + (CodeGenOpts.KeepStaticConsts && VD->getStorageDuration() == SD_Static && + VD->getType().isConstQualified()))) + return true; return getContext().DeclMustBeEmitted(Global); } Index: clang/lib/CodeGen/CGDecl.cpp =================================================================== --- clang/lib/CodeGen/CGDecl.cpp +++ clang/lib/CodeGen/CGDecl.cpp @@ -469,6 +469,9 @@ else if (D.hasAttr<UsedAttr>()) CGM.addUsedOrCompilerUsedGlobal(var); + if (CGM.getCodeGenOpts().KeepPersistentStorageVariables) + CGM.addUsedOrCompilerUsedGlobal(var); + // We may have to cast the constant because of the initializer // mismatch above. // Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -1697,6 +1697,10 @@ CodeGenOpts<"KeepStaticConsts">, DefaultFalse, PosFlag<SetTrue, [CC1Option], "Keep">, NegFlag<SetFalse, [], "Don't keep">, BothFlags<[NoXarchOption], " static const variables if unused">>; +defm keep_persistent_storage_variables : BoolFOption<"keep-persistent-storage-variables", + CodeGenOpts<"KeepPersistentStorageVariables">, DefaultFalse, + PosFlag<SetTrue, [CC1Option], "Enable">, NegFlag<SetFalse, [], "Disable">, + BothFlags<[NoXarchOption], " keeping all variables that have a persistent storage duration, including global, static and thread local variables, to guarantee that they can be directly addressed">>; defm fixed_point : BoolFOption<"fixed-point", LangOpts<"FixedPoint">, DefaultFalse, PosFlag<SetTrue, [CC1Option], "Enable">, NegFlag<SetFalse, [], "Disable">, Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -472,6 +472,10 @@ /// Whether to emit unused static constants. CODEGENOPT(KeepStaticConsts, 1, 0) +/// Whether to emit all variables that have a persisent storage duration, +/// including global, static and thread local variables. +CODEGENOPT(KeepPersistentStorageVariables, 1, 0) + /// Whether to follow the AAPCS enforcing at least one read before storing to a volatile bitfield CODEGENOPT(ForceAAPCSBitfieldLoad, 1, 0)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits