[PATCH] D44336: Implement --cref.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 14 13:26:49 PDT 2018
LGTM
Rui Ueyama via Phabricator <reviews at reviews.llvm.org> writes:
> ruiu updated this revision to Diff 138440.
> ruiu added a comment.
>
> - address review comments.
>
>
> https://reviews.llvm.org/D44336
>
> Files:
> lld/ELF/Config.h
> lld/ELF/Driver.cpp
> lld/ELF/MapFile.cpp
> lld/ELF/MapFile.h
> lld/ELF/Options.td
> lld/ELF/Writer.cpp
> lld/test/ELF/cref.s
> lld/test/ELF/silent-ignore.test
>
> Index: lld/test/ELF/silent-ignore.test
> ===================================================================
> --- lld/test/ELF/silent-ignore.test
> +++ lld/test/ELF/silent-ignore.test
> @@ -1,6 +1,5 @@
> RUN: ld.lld --version \
> RUN: -allow-shlib-undefined \
> -RUN: -cref \
> RUN: -g \
> RUN: -no-add-needed \
> RUN: -no-allow-shlib-undefined \
> Index: lld/test/ELF/cref.s
> ===================================================================
> --- /dev/null
> +++ lld/test/ELF/cref.s
> @@ -0,0 +1,26 @@
> +// REQUIRES: x86
> +
> +// RUN: echo '.global foo; foo:' | llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %t1.o
> +// RUN: echo '.global foo, bar; bar:' | llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %t2.o
> +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t3.o
> +// RUN: ld.lld -shared -o %t1.so %t1.o -gc-sections
> +// RUN: ld.lld -o /dev/null %t1.so %t2.o %t3.o -cref | FileCheck -strict-whitespace %s
> +
> +// CHECK: Symbol File
> +// CHECK-NEXT: bar {{.*}}2.o
> +// CHECK-NEXT: {{.*}}3.o
> +// CHECK-NEXT: foo {{.*}}1.so
> +// CHECK-NEXT: {{.*}}2.o
> +// CHECK-NEXT: {{.*}}3.o
> +// CHECK-NEXT: _start {{.*}}3.o
> +// CHECK-NEXT: baz {{.*}}3.o
> +
> +.global _start, foo, bar, baz
> +_start:
> + call foo
> + call bar
> +localsym:
> +baz:
> +
> +.section .text.a,"ax", at progbits
> +discarded:
> Index: lld/ELF/Writer.cpp
> ===================================================================
> --- lld/ELF/Writer.cpp
> +++ lld/ELF/Writer.cpp
> @@ -475,8 +475,9 @@
> if (errorCount())
> return;
>
> - // Handle -Map option.
> + // Handle -Map and -cref options.
> writeMapFile();
> + writeCrossReferenceTable();
> if (errorCount())
> return;
>
> Index: lld/ELF/Options.td
> ===================================================================
> --- lld/ELF/Options.td
> +++ lld/ELF/Options.td
> @@ -75,6 +75,10 @@
> def color_diagnostics_eq: J<"color-diagnostics=">,
> HelpText<"Use colors in diagnostics">;
>
> +defm cref: B<"cref",
> + "Output cross reference table",
> + "Do not output cross reference table">;
> +
> defm define_common: B<"define-common",
> "Assign space to common symbols",
> "Do not assign space to common symbols">;
> @@ -420,7 +424,6 @@
>
> // Options listed below are silently ignored for now for compatibility.
> def allow_shlib_undefined: F<"allow-shlib-undefined">;
> -def cref: F<"cref">;
> def detect_odr_violations: F<"detect-odr-violations">;
> def g: Flag<["-"], "g">;
> def long_plt: F<"long-plt">;
> Index: lld/ELF/MapFile.h
> ===================================================================
> --- lld/ELF/MapFile.h
> +++ lld/ELF/MapFile.h
> @@ -13,6 +13,7 @@
> namespace lld {
> namespace elf {
> void writeMapFile();
> +void writeCrossReferenceTable();
> } // namespace elf
> } // namespace lld
>
> Index: lld/ELF/MapFile.cpp
> ===================================================================
> --- lld/ELF/MapFile.cpp
> +++ lld/ELF/MapFile.cpp
> @@ -28,6 +28,8 @@
> #include "SyntheticSections.h"
> #include "lld/Common/Strings.h"
> #include "lld/Common/Threads.h"
> +#include "llvm/ADT/MapVector.h"
> +#include "llvm/ADT/SetVector.h"
> #include "llvm/Support/raw_ostream.h"
>
> using namespace llvm;
> @@ -146,3 +148,50 @@
> }
> }
> }
> +
> +static void print(StringRef A, StringRef B) {
> + outs() << left_justify(A, 49) << " " << B << "\n";
> +}
> +
> +// Output a cross reference table to stdout. This is for --cref.
> +//
> +// For each global symbol, we print out a file that defines the symbol
> +// followed by files that uses that symbol. Here is an example.
> +//
> +// strlen /lib/x86_64-linux-gnu/libc.so.6
> +// tools/lld/tools/lld/CMakeFiles/lld.dir/lld.cpp.o
> +// lib/libLLVMSupport.a(PrettyStackTrace.cpp.o)
> +//
> +// In this case, strlen is defined by libc.so.6 and used by other two
> +// files.
> +void elf::writeCrossReferenceTable() {
> + if (!Config->Cref)
> + return;
> +
> + // Collect symbols and files.
> + MapVector<Symbol *, SetVector<InputFile *>> Map;
> + for (InputFile *File : ObjectFiles) {
> + for (Symbol *Sym : File->getSymbols()) {
> + if (isa<SharedSymbol>(Sym))
> + Map[Sym].insert(File);
> + if (auto *D = dyn_cast<Defined>(Sym))
> + if (!D->isLocal() && (!D->Section || D->Section->Live))
> + Map[D].insert(File);
> + }
> + }
> +
> + // Print out a header.
> + outs() << "Cross Reference Table\n\n";
> + print("Symbol", "File");
> +
> + // Print out a table.
> + for (auto KV : Map) {
> + Symbol *Sym = KV.first;
> + SetVector<InputFile *> &Files = KV.second;
> +
> + print(toString(*Sym), toString(Sym->File));
> + for (InputFile *File : Files)
> + if (File != Sym->File)
> + print("", toString(File));
> + }
> +}
> Index: lld/ELF/Driver.cpp
> ===================================================================
> --- lld/ELF/Driver.cpp
> +++ lld/ELF/Driver.cpp
> @@ -618,6 +618,7 @@
> Args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
> Config->Chroot = Args.getLastArgValue(OPT_chroot);
> Config->CompressDebugSections = getCompressDebugSections(Args);
> + Config->Cref = Args.hasFlag(OPT_cref, OPT_no_cref, false);
> Config->DefineCommon = Args.hasFlag(OPT_define_common, OPT_no_define_common,
> !Args.hasArg(OPT_relocatable));
> Config->Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, true);
> Index: lld/ELF/Config.h
> ===================================================================
> --- lld/ELF/Config.h
> +++ lld/ELF/Config.h
> @@ -113,6 +113,7 @@
> bool BsymbolicFunctions;
> bool CheckSections;
> bool CompressDebugSections;
> + bool Cref;
> bool DefineCommon;
> bool Demangle = true;
> bool DisableVerify;
More information about the llvm-commits
mailing list