[PATCH] D82613: [llvm-install-name-tool] Add -change option

Sameer Arora via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 29 07:31:31 PDT 2020


sameerarora101 marked 3 inline comments as done.
sameerarora101 added inline comments.


================
Comment at: llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp:280-283
       if (LC.MachOLoadCommand.load_command_data.cmd == MachO::LC_ID_DYLIB) {
         updateLoadCommandPayload<MachO::dylib_command>(LC, Id);
         break;
       }
----------------
jhenderson wrote:
> sameerarora101 wrote:
> > jhenderson wrote:
> > > I think it might make sense to move this logic inside the loop below - it probably doesn't make sense to loop over the load commands multiple times if you specify multiple options. The same might apply in relation the rpath stuff too.
> > > 
> > > What do you think?
> > Yup, I moved the `-id` logic in the same loop as `-change` now. 
> > 
> > However, I don't think we can do the same for rpath stuff because of all the error checking we need to perform. For eg., in case of `-add_rpath`, for each rpath to be added, we need to iterate through all LCs anyway so as to make sure we aren't duplicating rpaths. Similarly, in case of `-delete_rpath` we need to iterate through the whole list to throw an error in case we aren't able to find the rpath to be deleted. 
> > 
> >  But yeah, in case of `-id` and `-change` there is no such error checking that requires checking over all LCs, so I was able to put them in the same loop easily.
> I think it might be possible with some extra refactoring, but I'd recommend deferring that to a separate patch. What I'm thinking in semi-pseudo code terms is roughly:
> 
> ```
> std::unordered_set<StringRef> RPaths; // Pick your container of choice here. Also useful for the add rpath loop.
> std::unordered_set<StirngRef> OriginalRPaths;
> ...
> case MachO::LC_RPATH:
>   StringRef Current = getLoadCommandPayloadString(LC);
>   auto FoundArg = find_if(Config.RPathsToUpdate, IsFirstMatching);
>   OriginalRPaths.insert(Current);
>   if (!RPaths.insert(Current).second) // If already in RPaths...
>     // report duplicate rpath error.
>   if (FoundArg != Config.RPathsToUpdate.end())
>     updateLoadCommandPayloadString<MachO::rpath_command>(Current, FoundArg->second);
> ...
> // After loop.
> for (const auto &RPair : Config.RPathsToUpdate) {
>   if (OriginalRPaths.count(RPair.first) == 0)
>     // Did not find rpath error.
> }
> ```
I see now. Yup, this would be a nice change. I'll push a separate diff for this change. Thanks a lot 😊


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82613/new/

https://reviews.llvm.org/D82613





More information about the llvm-commits mailing list