[lld] r212093 - [mach-o] add representation for LC_ID_DYLIB to MachONormalizedFile

Evgeniy Stepanov eugeni.stepanov at gmail.com
Thu Jul 3 05:15:05 PDT 2014


Hi,

this test seems to be flaky:
http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-debian-fast/builds/16473/steps/test/logs/stdio


On Tue, Jul 1, 2014 at 12:15 PM, Tim Northover <tnorthover at apple.com> wrote:
> Author: tnorthover
> Date: Tue Jul  1 03:15:41 2014
> New Revision: 212093
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212093&view=rev
> Log:
> [mach-o] add representation for LC_ID_DYLIB to MachONormalizedFile
>
> It still needs to be tied into BinaryReader, but this allows reasonably
> sensible creation of SharedLibrary atoms on MachO.
>
> Added:
>     lld/trunk/test/mach-o/Inputs/
>     lld/trunk/test/mach-o/Inputs/use-dylib-install-names.yaml
>     lld/trunk/test/mach-o/dylib-install-names.yaml
> Modified:
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp
>     lld/trunk/test/mach-o/lit.local.cfg
>     lld/trunk/test/mach-o/use-simple-dylib.yaml
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp Tue Jul  1 03:15:41 2014
> @@ -386,6 +386,15 @@ readBinary(std::unique_ptr<MemoryBuffer>
>          }
>        }
>      }
> +    if (cmd == LC_ID_DYLIB) {
> +      const dylib_command *dl = reinterpret_cast<const dylib_command*>(lc);
> +      dylib_command tempDL;
> +      if (swap) {
> +        tempDL = *dl; swapStruct(tempDL); dl = &tempDL;
> +      }
> +
> +      f->installName = lc + dl->dylib.name;
> +    }
>      return false;
>    });
>    if (ec)
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Tue Jul  1 03:15:41 2014
> @@ -324,6 +324,12 @@ uint32_t MachOFileLayout::loadCommandsSi
>    size += segCommandSize;
>    ++count;
>
> +  // If creating a dylib, add LC_ID_DYLIB.
> +  if (_file.fileType == llvm::MachO::MH_DYLIB) {
> +    size += sizeof(dylib_command) + pointerAlign(_file.installName.size() + 1);
> +    ++count;
> +  }
> +
>    // Add LC_DYLD_INFO
>    size += sizeof(dyld_info_command);
>    ++count;
> @@ -621,6 +627,24 @@ std::error_code MachOFileLayout::writeLo
>      else
>        ec = writeSegmentLoadCommands<MachO32Trait>(lc);
>
> +    // Add LC_ID_DYLIB command for dynamic libraries.
> +    if (_file.fileType == llvm::MachO::MH_DYLIB) {
> +      dylib_command *dc = reinterpret_cast<dylib_command*>(lc);
> +      StringRef path = _file.installName;
> +      uint32_t size = sizeof(dylib_command) + pointerAlign(path.size() + 1);
> +      dc->cmd                         = LC_ID_DYLIB;
> +      dc->cmdsize                     = size;
> +      dc->dylib.name                  = sizeof(dylib_command); // offset
> +      dc->dylib.timestamp             = 0; // FIXME
> +      dc->dylib.current_version       = 0; // FIXME
> +      dc->dylib.compatibility_version = 0; // FIXME
> +      if (_swap)
> +        swapStruct(*dc);
> +      memcpy(lc + sizeof(dylib_command), path.begin(), path.size());
> +      lc[sizeof(dylib_command) + path.size()] = '\0';
> +      lc += size;
> +    }
> +
>      // Add LC_DYLD_INFO_ONLY.
>      dyld_info_command* di = reinterpret_cast<dyld_info_command*>(lc);
>      di->cmd            = LC_DYLD_INFO_ONLY;
> @@ -720,7 +744,6 @@ std::error_code MachOFileLayout::writeLo
>        lc[sizeof(dylib_command)+dep.path.size()] = '\0';
>        lc += size;
>      }
> -
>    }
>    return ec;
>  }
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp Tue Jul  1 03:15:41 2014
> @@ -934,6 +934,7 @@ normalizedFromAtoms(const lld::File &ato
>    f->arch = context.arch();
>    f->fileType = context.outputMachOType();
>    f->flags = util.fileFlags();
> +  f->installName = context.installName();
>    util.copySegmentInfo(normFile);
>    util.copySections(normFile);
>    util.addDependentDylibs(atomFile, normFile);
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp Tue Jul  1 03:15:41 2014
> @@ -605,7 +605,8 @@ normalizedObjectToAtoms(const Normalized
>  ErrorOr<std::unique_ptr<lld::File>>
>  normalizedDylibToAtoms(const NormalizedFile &normalizedFile, StringRef path,
>                         bool copyRefs) {
> -  std::unique_ptr<MachODylibFile> file(new MachODylibFile(path));
> +  std::unique_ptr<MachODylibFile> file(
> +      new MachODylibFile(normalizedFile.installName));
>
>    for (auto &sym : normalizedFile.globalSymbols) {
>      assert((sym.scope & N_EXT) && "only expect external symbols here");
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp Tue Jul  1 03:15:41 2014
> @@ -508,7 +508,6 @@ struct MappingTraits<DependentDylib> {
>    }
>  };
>
> -
>  template <>
>  struct ScalarEnumerationTraits<RebaseType> {
>    static void enumeration(IO &io, RebaseType &value) {
>
> Added: lld/trunk/test/mach-o/Inputs/use-dylib-install-names.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/Inputs/use-dylib-install-names.yaml?rev=212093&view=auto
> ==============================================================================
> --- lld/trunk/test/mach-o/Inputs/use-dylib-install-names.yaml (added)
> +++ lld/trunk/test/mach-o/Inputs/use-dylib-install-names.yaml Tue Jul  1 03:15:41 2014
> @@ -0,0 +1,28 @@
> +--- !mach-o
> +arch:            x86_64
> +file-type:       MH_OBJECT
> +flags:           [  ]
> +has-UUID:        false
> +OS:              unknown
> +sections:
> +  - segment:         __TEXT
> +    section:         __text
> +    type:            S_REGULAR
> +    attributes:      [ S_ATTR_PURE_INSTRUCTIONS ]
> +    address:         0x0000000000000000
> +    content:         [ 0x55, 0x48, 0x89, 0xE5, 0xE8, 0x00, 0x00, 0x00,
> +                       0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00,
> +                       0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00,
> +                       0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xE9, 0x00,
> +                       0x00, 0x00, 0x00 ]
> +global-symbols:
> +  - name:            _foo
> +    type:            N_SECT
> +    scope:           [ N_EXT ]
> +    sect:            1
> +    value:           0x0000000000000000
> +undefined-symbols:
> +  - name:            _myGlobal
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
>
> Added: lld/trunk/test/mach-o/dylib-install-names.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/dylib-install-names.yaml?rev=212093&view=auto
> ==============================================================================
> --- lld/trunk/test/mach-o/dylib-install-names.yaml (added)
> +++ lld/trunk/test/mach-o/dylib-install-names.yaml Tue Jul  1 03:15:41 2014
> @@ -0,0 +1,41 @@
> +# RUN: lld -flavor darwin -arch x86_64 -install_name libwibble.dylib -dylib %s -o %t.dylib
> +# RUN: macho-dump %t.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
> +# RUN: lld -flavor darwin -arch x86_64 %p/Inputs/use-dylib-install-names.yaml %t.dylib -r -print_atoms | FileCheck %s --check-prefix=CHECK-BINARY-READ
> +
> +--- !mach-o
> +arch:            x86_64
> +file-type:       MH_OBJECT
> +flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
> +has-UUID:        false
> +OS:              unknown
> +sections:
> +  - segment:         __TEXT
> +    section:         __text
> +    type:            S_REGULAR
> +    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
> +    alignment:       4
> +    address:         0x0000000000000000
> +    content:         [ 0xCC, 0xC3, 0x90, 0xC3, 0x90, 0x90, 0xC3, 0x90,
> +                       0x90, 0x90, 0xC3, 0x90, 0x90, 0x90, 0x90, 0xC3,
> +                       0x31, 0xC0, 0xC3 ]
> +local-symbols:
> +  - name:            _myStatic
> +    type:            N_SECT
> +    sect:            1
> +    value:           0x000000000000000B
> +global-symbols:
> +  - name:            _myGlobal
> +    type:            N_SECT
> +    scope:           [ N_EXT ]
> +    sect:            1
> +    value:           0x0000000000000001
> +...
> +
> +
> +# CHECK-BINARY-WRITE: (('command', 13)
> +# CHECK-BINARY-WRITE-NEXT:  ('size', 40)
> +# CHECK-BINARY-WRITE-NEXT:  ('install_name', 'libwibble.dylib')
> +
> +# CHECK-BINARY-READ: shared-library-atoms:
> +# CHECK-BINARY-READ:     - name:          _myGlobal
> +# CHECK-BINARY-READ:       load-name:     libwibble.dylib
>
> Modified: lld/trunk/test/mach-o/lit.local.cfg
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/lit.local.cfg?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/test/mach-o/lit.local.cfg (original)
> +++ lld/trunk/test/mach-o/lit.local.cfg Tue Jul  1 03:15:41 2014
> @@ -1,3 +1,4 @@
>
>  # mach-o test cases encode input files in yaml and use .yaml extension
>  config.suffixes = ['.yaml']
> +config.excludes = ['Inputs']
>
> Modified: lld/trunk/test/mach-o/use-simple-dylib.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/use-simple-dylib.yaml?rev=212093&r1=212092&r2=212093&view=diff
> ==============================================================================
> --- lld/trunk/test/mach-o/use-simple-dylib.yaml (original)
> +++ lld/trunk/test/mach-o/use-simple-dylib.yaml Tue Jul  1 03:15:41 2014
> @@ -1,5 +1,5 @@
>  # RUN: lld -flavor darwin -arch x86_64 -print_atoms -r %s | FileCheck %s
> -# lld -flavor darwin -arch x86_64 -print_atoms -r %s %p/Inputs/simple-dylib.yaml -o - | FileCheck %s
> +
>
>  --- !mach-o
>  arch:            x86_64
> @@ -110,6 +110,8 @@ global-symbols:
>      sect:            1
>      desc:            [ N_SYMBOL_RESOLVER ]
>      value:           0x0000000000000010
> +
> +install-name:        libspecial.dylib
>  ...
>
>
> @@ -118,12 +120,12 @@ global-symbols:
>  # CHECK:   - name:            _myVariablePreviouslyKnownAsPrivateExtern
>  # CHECK: shared-library-atoms:
>  # CHECK:   - name:            _myHidden
> -# CHECK:     load-name:       {{.*}}use-simple-dylib.yaml
> +# CHECK:     load-name:       libspecial.dylib
>  # CHECK:   - name:            _myGlobal
> -# CHECK:     load-name:       {{.*}}use-simple-dylib.yaml
> +# CHECK:     load-name:       libspecial.dylib
>  # CHECK:   - name:            _myHiddenWeak
> -# CHECK:     load-name:       {{.*}}use-simple-dylib.yaml
> +# CHECK:     load-name:       libspecial.dylib
>  # CHECK:   - name:            _myGlobalWeak
> -# CHECK:     load-name:       {{.*}}use-simple-dylib.yaml
> +# CHECK:     load-name:       libspecial.dylib
>  # CHECK:   - name:            _myResolver
> -# CHECK:     load-name:       {{.*}}use-simple-dylib.yaml
> +# CHECK:     load-name:       libspecial.dylib
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list