[llvm] 365b60f - New pass to make internal linkage symbol names unique.

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 20 15:12:14 PDT 2020


Assuming this is for propeller it seems reasonable to document that (unless
we have some other uses in mind as well).

-eric

On Mon, Apr 20, 2020 at 3:05 PM Sriraman Tallam via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> Author: Sriraman Tallam
> Date: 2020-04-20T15:05:22-07:00
> New Revision: 365b60fc9371209f855d89f5d08c3f5ea9400711
>
> URL:
> https://github.com/llvm/llvm-project/commit/365b60fc9371209f855d89f5d08c3f5ea9400711
> DIFF:
> https://github.com/llvm/llvm-project/commit/365b60fc9371209f855d89f5d08c3f5ea9400711.diff
>
> LOG: New pass to make internal linkage symbol names unique.
>
> With clang option -funique-internal-linkage-symbols, symbols with
> internal linkage get names with the module hash appended.
>
> Differential Revision: https://reviews.llvm.org/D78243
>
> Added:
>     llvm/include/llvm/Transforms/Utils/UniqueInternalLinkageNames.h
>     llvm/lib/Transforms/Utils/UniqueInternalLinkageNames.cpp
>     llvm/test/Transforms/UniqueInternalLinkageNames/unique_symbol_names.ll
>
> Modified:
>     llvm/include/llvm/InitializePasses.h
>     llvm/include/llvm/Transforms/Utils.h
>     llvm/lib/Transforms/Utils/CMakeLists.txt
>     llvm/lib/Transforms/Utils/Utils.cpp
>     llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/llvm/include/llvm/InitializePasses.h
> b/llvm/include/llvm/InitializePasses.h
> index f35815a898d4..5eed68599419 100644
> --- a/llvm/include/llvm/InitializePasses.h
> +++ b/llvm/include/llvm/InitializePasses.h
> @@ -304,6 +304,7 @@ void initializeModuloScheduleTestPass(PassRegistry&);
>  void initializeMustExecutePrinterPass(PassRegistry&);
>  void initializeMustBeExecutedContextPrinterPass(PassRegistry&);
>  void initializeNameAnonGlobalLegacyPassPass(PassRegistry&);
> +void initializeUniqueInternalLinkageNamesLegacyPassPass(PassRegistry &);
>  void initializeNaryReassociateLegacyPassPass(PassRegistry&);
>  void initializeNewGVNLegacyPassPass(PassRegistry&);
>  void initializeObjCARCAAWrapperPassPass(PassRegistry&);
>
> diff  --git a/llvm/include/llvm/Transforms/Utils.h
> b/llvm/include/llvm/Transforms/Utils.h
> index 59beb0caab1d..29090e2b2ac0 100644
> --- a/llvm/include/llvm/Transforms/Utils.h
> +++ b/llvm/include/llvm/Transforms/Utils.h
> @@ -25,6 +25,12 @@ class Pass;
>  //
>  ModulePass *createMetaRenamerPass();
>
>
> +//===----------------------------------------------------------------------===//
> +// createUniqueInternalLinkageNamesPass - Make internal linkage symbol
> names
> +// unique.
> +//
> +ModulePass *createUniqueInternalLinkageNamesPass();
> +
>
>  //===----------------------------------------------------------------------===//
>  //
>  // LowerInvoke - This pass removes invoke instructions, converting them
> to call
>
> diff  --git
> a/llvm/include/llvm/Transforms/Utils/UniqueInternalLinkageNames.h
> b/llvm/include/llvm/Transforms/Utils/UniqueInternalLinkageNames.h
> new file mode 100644
> index 000000000000..637b5d8e8e51
> --- /dev/null
> +++ b/llvm/include/llvm/Transforms/Utils/UniqueInternalLinkageNames.h
> @@ -0,0 +1,31 @@
> +//===-- UniqueInternalLinkageNames.h - Uniq. Int. Linkage Names -*- C++
> -*-===//
> +//
> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM
> Exceptions.
> +// See https://llvm.org/LICENSE.txt for license information.
> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements unique naming of internal linkage symbols with
> option
> +// -funique-internal-linkage-symbols.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_TRANSFORMS_UTILS_UNIQUEINTERNALLINKAGENAMES_H
> +#define LLVM_TRANSFORMS_UTILS_UNIQUEINTERNALLINKAGENAMES_H
> +
> +#include "llvm/IR/Module.h"
> +#include "llvm/IR/PassManager.h"
> +
> +namespace llvm {
> +
> +/// Simple pass that provides a name to every anonymous globals.
> +class UniqueInternalLinkageNamesPass
> +    : public PassInfoMixin<UniqueInternalLinkageNamesPass> {
> +public:
> +  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
> +};
> +
> +} // end namespace llvm
> +
> +#endif // LLVM_TRANSFORMS_UTILS_UNIQUEINTERNALLINKAGENAMES_H
>
> diff  --git a/llvm/lib/Transforms/Utils/CMakeLists.txt
> b/llvm/lib/Transforms/Utils/CMakeLists.txt
> index 9a316ad1b36f..0ca23669e97d 100644
> --- a/llvm/lib/Transforms/Utils/CMakeLists.txt
> +++ b/llvm/lib/Transforms/Utils/CMakeLists.txt
> @@ -65,6 +65,7 @@ add_llvm_component_library(LLVMTransformUtils
>    SymbolRewriter.cpp
>    UnifyFunctionExitNodes.cpp
>    UnifyLoopExits.cpp
> +  UniqueInternalLinkageNames.cpp
>    Utils.cpp
>    ValueMapper.cpp
>    VNCoercion.cpp
>
> diff  --git a/llvm/lib/Transforms/Utils/UniqueInternalLinkageNames.cpp
> b/llvm/lib/Transforms/Utils/UniqueInternalLinkageNames.cpp
> new file mode 100644
> index 000000000000..5b58548e54dc
> --- /dev/null
> +++ b/llvm/lib/Transforms/Utils/UniqueInternalLinkageNames.cpp
> @@ -0,0 +1,97 @@
> +//===- UniqueInternalLinkageNames.cpp - Unique Internal Linkage Sym Names
> -===//
> +//
> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM
> Exceptions.
> +// See https://llvm.org/LICENSE.txt for license information.
> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements unique naming of internal linkage symbols with
> option
> +// -funique-internal-linkage-symbols.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/Transforms/Utils/UniqueInternalLinkageNames.h"
> +#include "llvm/ADT/SmallString.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/InitializePasses.h"
> +#include "llvm/Support/MD5.h"
> +#include "llvm/Transforms/Utils/ModuleUtils.h"
> +
> +using namespace llvm;
> +
> +static bool uniqueifyInternalLinkageNames(Module &M) {
> +  llvm::MD5 Md5;
> +  Md5.update(M.getSourceFileName());
> +  llvm::MD5::MD5Result R;
> +  Md5.final(R);
> +  SmallString<32> Str;
> +  llvm::MD5::stringifyResult(R, Str);
> +  std::string ModuleNameHash = (Twine(".") + Twine(Str)).str();
> +  bool Changed = false;
> +
> +  // Append the module hash to all internal linkage functions.
> +  for (auto &F : M) {
> +    if (F.hasInternalLinkage()) {
> +      F.setName(F.getName() + ModuleNameHash);
> +      Changed = true;
> +    }
> +  }
> +
> +  // Append the module hash to all internal linkage globals.
> +  for (auto &GV : M.globals()) {
> +    if (GV.hasInternalLinkage()) {
> +      GV.setName(GV.getName() + ModuleNameHash);
> +      Changed = true;
> +    }
> +  }
> +  return Changed;
> +}
> +
> +namespace {
> +
> +// Legacy pass that provides a name to every anon globals.
> +class UniqueInternalLinkageNamesLegacyPass : public ModulePass {
> +
> +public:
> +  /// Pass identification, replacement for typeid
> +  static char ID;
> +
> +  /// Specify pass name for debug output
> +  StringRef getPassName() const override {
> +    return "Unique Internal Linkage Names";
> +  }
> +
> +  explicit UniqueInternalLinkageNamesLegacyPass() : ModulePass(ID) {
> +    initializeUniqueInternalLinkageNamesLegacyPassPass(
> +        *PassRegistry::getPassRegistry());
> +  }
> +
> +  bool runOnModule(Module &M) override {
> +    return uniqueifyInternalLinkageNames(M);
> +  }
> +};
> +
> +char UniqueInternalLinkageNamesLegacyPass::ID = 0;
> +} // anonymous namespace
> +
> +PreservedAnalyses
> +UniqueInternalLinkageNamesPass::run(Module &M, ModuleAnalysisManager &AM)
> {
> +  if (!uniqueifyInternalLinkageNames(M))
> +    return PreservedAnalyses::all();
> +
> +  return PreservedAnalyses::none();
> +}
> +
> +INITIALIZE_PASS_BEGIN(UniqueInternalLinkageNamesLegacyPass,
> +                      "unique-internal-linkage-names",
> +                      "Uniqueify internal linkage names", false, false)
> +INITIALIZE_PASS_END(UniqueInternalLinkageNamesLegacyPass,
> +                    "unique-internal-linkage-names",
> +                    "Uniqueify Internal linkage names", false, false)
> +
> +namespace llvm {
> +ModulePass *createUniqueInternalLinkageNamesPass() {
> +  return new UniqueInternalLinkageNamesLegacyPass();
> +}
> +} // namespace llvm
>
> diff  --git a/llvm/lib/Transforms/Utils/Utils.cpp
> b/llvm/lib/Transforms/Utils/Utils.cpp
> index 7469e388eb21..d67ff91d2208 100644
> --- a/llvm/lib/Transforms/Utils/Utils.cpp
> +++ b/llvm/lib/Transforms/Utils/Utils.cpp
> @@ -42,6 +42,7 @@ void llvm::initializeTransformUtils(PassRegistry
> &Registry) {
>    initializeInjectTLIMappingsLegacyPass(Registry);
>    initializeFixIrreduciblePass(Registry);
>    initializeUnifyLoopExitsPass(Registry);
> +  initializeUniqueInternalLinkageNamesLegacyPassPass(Registry);
>  }
>
>  /// LLVMInitializeTransformUtils - C binding for
> initializeTransformUtilsPasses.
>
> diff  --git
> a/llvm/test/Transforms/UniqueInternalLinkageNames/unique_symbol_names.ll
> b/llvm/test/Transforms/UniqueInternalLinkageNames/unique_symbol_names.ll
> new file mode 100644
> index 000000000000..e2ff4aed6e29
> --- /dev/null
> +++
> b/llvm/test/Transforms/UniqueInternalLinkageNames/unique_symbol_names.ll
> @@ -0,0 +1,13 @@
> +; RUN: opt -S -unique-internal-linkage-names < %s | FileCheck %s
> +
> +source_filename = "foo.c"
> +
> + at glob = internal global i32 0
> +
> +define internal i32 @foo() {
> +entry:
> +  ret i32 0
> +}
> +
> +; CHECK: @glob.6ae72bb15a7d1834b42ae042a58f7a4d = internal global
> +; CHECK: define internal i32 @foo.6ae72bb15a7d1834b42ae042a58f7a4d()
>
> diff  --git a/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
> b/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
> index c1acc7ddb76b..978db52c3eed 100644
> --- a/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
> +++ b/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
> @@ -72,6 +72,7 @@ static_library("Utils") {
>      "SymbolRewriter.cpp",
>      "UnifyFunctionExitNodes.cpp",
>      "UnifyLoopExits.cpp",
> +    "UniqueInternalLinkageNames.cpp",
>      "Utils.cpp",
>      "VNCoercion.cpp",
>      "ValueMapper.cpp",
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200420/04e6b086/attachment-0001.html>


More information about the llvm-commits mailing list