[PATCH] D44274: Object: Fix handling of @@@ in .symver directive
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 12 14:15:02 PDT 2018
LGTM
Thanks,
Rafael
Vitaly Buka via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> vitalybuka updated this revision to Diff 137861.
> vitalybuka added a comment.
>
> fix
>
>
> https://reviews.llvm.org/D44274
>
> Files:
> llvm/lib/Object/RecordStreamer.cpp
> llvm/test/LTO/X86/symver-asm3.ll
>
> Index: llvm/test/LTO/X86/symver-asm3.ll
> ===================================================================
> --- /dev/null
> +++ llvm/test/LTO/X86/symver-asm3.ll
> @@ -0,0 +1,21 @@
> +; Test special handling of @@@.
> +
> +; RUN: llvm-as < %s >%t1
> +; RUN: llvm-nm %t1 | FileCheck %s
> +
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +module asm "_start1:"
> +module asm ".symver _start1, foo@@@SOME_VERSION1"
> +module asm ".symver _start2, foo@@@SOME_VERSION2"
> +module asm ".symver _start3, foo@@@SOME_VERSION3"
> +module asm "_start3:"
> +module asm ".local _start1"
> +module asm ".local _start3"
> +
> +; CHECK-DAG: t _start1
> +; CHECK-DAG: U _start2
> +; CHECK-DAG: t foo@@SOME_VERSION1
> +; CHECK-DAG: t foo at SOME_VERSION2
> +; CHECK-DAG: t foo@@SOME_VERSION3
> Index: llvm/lib/Object/RecordStreamer.cpp
> ===================================================================
> --- llvm/lib/Object/RecordStreamer.cpp
> +++ llvm/lib/Object/RecordStreamer.cpp
> @@ -149,6 +149,7 @@
> for (auto &Symver : SymverAliasMap) {
> const MCSymbol *Aliasee = Symver.first;
> MCSymbolAttr Attr = MCSA_Invalid;
> + bool IsDefined = false;
>
> // First check if the aliasee binding was recorded in the asm.
> RecordStreamer::State state = getSymbolState(Aliasee);
> @@ -165,26 +166,53 @@
> break;
> }
>
> - // If we don't have a symbol attribute from assembly, then check if
> - // the aliasee was defined in the IR.
> - if (Attr == MCSA_Invalid) {
> - const auto *GV = M.getNamedValue(Aliasee->getName());
> + switch (state) {
> + case RecordStreamer::Defined:
> + case RecordStreamer::DefinedGlobal:
> + case RecordStreamer::DefinedWeak:
> + IsDefined = true;
> + break;
> + case RecordStreamer::NeverSeen:
> + case RecordStreamer::Global:
> + case RecordStreamer::Used:
> + case RecordStreamer::UndefinedWeak:
> + break;
> + }
> +
> + const GlobalValue *GV = nullptr;
> + if (Attr == MCSA_Invalid || !IsDefined) {
> + GV = M.getNamedValue(Aliasee->getName());
> if (!GV) {
> auto MI = MangledNameMap.find(Aliasee->getName());
> if (MI != MangledNameMap.end())
> GV = MI->second;
> }
> if (GV) {
> - if (GV->hasExternalLinkage())
> - Attr = MCSA_Global;
> - else if (GV->hasLocalLinkage())
> - Attr = MCSA_Local;
> - else if (GV->isWeakForLinker())
> - Attr = MCSA_Weak;
> + // If we don't have a symbol attribute from assembly, then check if
> + // the aliasee was defined in the IR.
> + if (Attr == MCSA_Invalid) {
> + if (GV->hasExternalLinkage())
> + Attr = MCSA_Global;
> + else if (GV->hasLocalLinkage())
> + Attr = MCSA_Local;
> + else if (GV->isWeakForLinker())
> + Attr = MCSA_Weak;
> + }
> + IsDefined = IsDefined || !GV->isDeclarationForLinker();
> }
> }
> +
> // Set the detected binding on each alias with this aliasee.
> for (auto AliasName : Symver.second) {
> + std::pair<StringRef, StringRef> Split = AliasName.split("@@@");
> + SmallString<128> NewName;
> + if (!Split.second.empty() && !Split.second.startswith("@")) {
> + // Special processing for "@@@" according
> + // https://sourceware.org/binutils/docs/as/Symver.html
> + const char *Separator = IsDefined ? "@@" : "@";
> + AliasName =
> + (Split.first + Separator + Split.second).toStringRef(NewName);
> + }
> MCSymbol *Alias = getContext().getOrCreateSymbol(AliasName);
> // TODO: Handle "@@@". Depending on SymbolAttribute value it needs to be
> // converted into @ or @@.
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list