[PATCH] D46407: [tools] Introduce llvm-strip

Jake Ehrlich via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 4 12:31:36 PDT 2018


jakehehrlich added inline comments.


================
Comment at: tools/llvm-objcopy/CMakeLists.txt:10
 tablegen(LLVM Opts.inc -gen-opt-parser-defs)
-add_public_tablegen_target(ObjcopyTableGen)
+add_public_tablegen_target(OptsTableGen)
+
----------------
jhenderson wrote:
> alexshap wrote:
> > jhenderson wrote:
> > > I'm not really familiar with cmake, but does this name have to be unique? If so, we might want to go back to the old name.
> > if it matters - sure, i just wanted to have a consistent naming scheme Opts -> OptsTableGen, StripOpts -> StripOptsTableGen etc
> If it doesn't need to be unique, I'm happy with it as is. If it does, I think we need a name that is more tool-specific (even if it's just the old name), to avoid clashing with some other tool.
Actully, can we rename Opts.td to ObjcopyOpts.td?


================
Comment at: tools/llvm-objcopy/llvm-objcopy.cpp:519
+  CopyConfig Config;
+  if (sys::path::stem(ToolName).endswith_lower("strip"))
+    Config = ParseStripOptions(makeArrayRef(argv + 1, argc));
----------------
alexshap wrote:
> jhenderson wrote:
> > alexshap wrote:
> > > jhenderson wrote:
> > > > I'm not a massive fan of using the tool's filename to determine the expected behaviour (example reason: if I change the executable from llvm-strip to llvm-strip-backup, when testing two versions of the tool side-by-side, I'd switch to objcopy style behaviour unexpectedly).
> > > > 
> > > > How feasible would it be to build two different executables, using the same source code, but a command-line specified define to control this?
> > > @jhenderson
> > > alexshap-mbp:tools alexshap$ grep -r -n add_llvm_tool_symlink ./*
> > > ./llvm-ar/CMakeLists.txt:17:add_llvm_tool_symlink(llvm-ranlib llvm-ar)
> > > ./llvm-ar/CMakeLists.txt:18:add_llvm_tool_symlink(llvm-lib llvm-ar)
> > > ./llvm-ar/CMakeLists.txt:19:add_llvm_tool_symlink(llvm-dlltool llvm-ar)
> > > ./llvm-ar/CMakeLists.txt:22:  add_llvm_tool_symlink(ar llvm-ar)
> > > ./llvm-ar/CMakeLists.txt:23:  add_llvm_tool_symlink(dlltool llvm-ar)
> > > ./llvm-ar/CMakeLists.txt:24:  add_llvm_tool_symlink(ranlib llvm-ar)
> > > ./llvm-cxxfilt/CMakeLists.txt:11:  add_llvm_tool_symlink(c++filt llvm-cxxfilt)
> > > ./llvm-dwp/CMakeLists.txt:20:  add_llvm_tool_symlink(dwp llvm-dwp)
> > > ./llvm-nm/CMakeLists.txt:19:  add_llvm_tool_symlink(nm llvm-nm)
> > > ./llvm-objcopy/CMakeLists.txt:21:  add_llvm_tool_symlink(objcopy llvm-objcopy)
> > > ./llvm-objdump/CMakeLists.txt:30:  add_llvm_tool_symlink(objdump llvm-objdump)
> > > ./llvm-readobj/CMakeLists.txt:26:add_llvm_tool_symlink(llvm-readelf llvm-readobj)
> > > ./llvm-readobj/CMakeLists.txt:29:  add_llvm_tool_symlink(readelf llvm-readobj)
> > > ./llvm-size/CMakeLists.txt:11:  add_llvm_tool_symlink(size llvm-size)
> > > ./llvm-strings/CMakeLists.txt:12:  add_llvm_tool_symlink(strings llvm-strings)
> > > ./llvm-symbolizer/CMakeLists.txt:20:  add_llvm_tool_symlink(addr2line llvm-symbolizer)
> > > 
> > > personally, I'm against building two different executables, it increases the build time, the size of the package, occupies the disk space.   
> > > personally, I'm against building two different executables, it increases the build time, the size of the package, occupies the disk space.
> > I think this is just a philosophical difference. Happy to defer to the code owner's preference.
> > 
> > FWIW, most of those examples aren't fair comparisons, since they are just mapping the  llvm tool name to the equivalent GNU name (which I have no issue with). In this case, we actually have different behaviour depending on the name, which I doubt is the case in any of those tools (although I haven't looked). That being said, LLD is also an example that does something similar (different behaviour depending on the file name).
> > 
> @jhenderson
> >which I doubt is the case in any of those tool
>  FWIW - that's not correct:
> 
> ./llvm-ar/llvm-ar.cpp:957:  Stem = sys::path::stem(ToolName);
> ./llvm-ar/llvm-ar.cpp-958-  if (Stem.contains_lower("dlltool"))
> 
> ./llvm-cov/llvm-cov.cpp:64:  if (sys::path::stem(argv[0]).endswith_lower("gcov"))
> ./llvm-cov/llvm-cov.cpp-65-    return gcovMain(argc, argv);
> 
> ./llvm-readobj/llvm-readobj.cpp:564:  if (sys::path::stem(argv[0]).find("readelf") != StringRef::npos)
> ./llvm-readobj/llvm-readobj.cpp-565-    opts::Output = opts::GNU;
> 
> maybe more, i didn't look further
I tried a while back, quite hard, to get cmake to build two tools using the same code. Unless we want to put the effort into making this a proper library (and e.g. making sure there is a sufficiently common interface to all object formats, making everything super nice, etc...) we can't make two separate binaries. Also teams that use llvm-objcopy care about toolchain size and this lets them add llvm-strip without worry. I thought a lot about how to make this a binary vs doing what every other tool has done and I decided I preferred the symlink option. Most of the point of moving to TableGen was to allow llvm-strip to exist. In a nutshell, I'd like to strongly advocate for this approach over what I see as the only alternative, making objcopy a library.


Repository:
  rL LLVM

https://reviews.llvm.org/D46407





More information about the llvm-commits mailing list