[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