[lld] r218718 - [mach-o] Implement -demangle.

Nick Kledzik kledzik at apple.com
Tue Sep 30 18:32:54 PDT 2014


On Sep 30, 2014, at 6:26 PM, Shankar Easwaran <shankare at codeaurora.org> wrote:

> The linking context changes are applicable for ELFLinkingContext as well, I cant think of any other option than duplicating the code in MachOLinkingContext in ELFLinkingContext.
> 
> What do you think ?
Yes copy/paste/tweak the code for ELF.

It is not exactly duplicating, because mach-o needs to remove a leading underscore on symbol names to call __cxa_demangle and ELF won’t.  Also the mach-o implementation will be changing to support demangling Swift symbols too.

-Nick

> 
> On 9/30/2014 6:15 PM, Nick Kledzik wrote:
>> Author: kledzik
>> Date: Tue Sep 30 18:15:39 2014
>> New Revision: 218718
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=218718&view=rev
>> Log:
>> [mach-o] Implement -demangle.
>> 
>> The darwin linker has the -demangle option which directs it to demangle C++
>> (and soon Swift) mangled symbol names. Long term we need some Diagnostics object
>> for formatting errors and warnings. But for now we have the Core linker just
>> writing messages to llvm::errs(). So, to enable demangling, I changed the
>> Resolver to call a LinkingContext method on the symbol name.
>> 
>> To make this more interesting, the demangling code is done via __cxa_demangle()
>> which is part of the C++ ABI, which is only supported on some platforms, so I
>> had to conditionalize the code with the config generated HAVE_CXXABI_H.
>> 
>> Added:
>>     lld/trunk/test/mach-o/demangle.yaml
>> Modified:
>>     lld/trunk/include/lld/Core/LinkingContext.h
>>     lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
>>     lld/trunk/lib/Core/Resolver.cpp
>>     lld/trunk/lib/Driver/DarwinLdDriver.cpp
>>     lld/trunk/lib/Driver/DarwinLdOptions.td
>>     lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
>> 
>> Modified: lld/trunk/include/lld/Core/LinkingContext.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkingContext.h?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/include/lld/Core/LinkingContext.h (original)
>> +++ lld/trunk/include/lld/Core/LinkingContext.h Tue Sep 30 18:15:39 2014
>> @@ -270,6 +270,11 @@ public:
>>    /// \returns true if there is an error with the current settings.
>>    bool validate(raw_ostream &diagnostics);
>>  +  /// Formats symbol name for use in error messages.
>> +  virtual std::string demangle(StringRef symbolName) const {
>> +    return symbolName;
>> +  }
>> +
>>    /// @}
>>    /// \name Methods used by Driver::link()
>>    /// @{
>> 
>> Modified: lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h (original)
>> +++ lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h Tue Sep 30 18:15:39 2014
>> @@ -66,6 +66,8 @@ public:
>>      void addPasses(PassManager &pm) override;
>>    bool validateImpl(raw_ostream &diagnostics) override;
>> +  std::string demangle(StringRef symbolName) const override;
>> +
>>    bool createImplicitFiles(std::vector<std::unique_ptr<File>> &) const override;
>>      uint32_t getCPUType() const;
>> @@ -95,6 +97,9 @@ public:
>>      bool keepPrivateExterns() const { return _keepPrivateExterns; }
>>    void setKeepPrivateExterns(bool v) { _keepPrivateExterns = v; }
>> +  bool demangleSymbols() const { return _demangle; }
>> +  void setDemangleSymbols(bool d) { _demangle = d; }
>> +
>>      bool minOS(StringRef mac, StringRef iOS) const;
>>    void setDoNothing(bool value) { _doNothing = value; }
>> @@ -289,6 +294,7 @@ private:
>>    bool _printAtoms;
>>    bool _testingFileUsage;
>>    bool _keepPrivateExterns;
>> +  bool _demangle;
>>    StringRef _bundleLoader;
>>    mutable std::unique_ptr<mach_o::ArchHandler> _archHandler;
>>    mutable std::unique_ptr<Writer> _writer;
>> 
>> Modified: lld/trunk/lib/Core/Resolver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Core/Resolver.cpp (original)
>> +++ lld/trunk/lib/Core/Resolver.cpp Tue Sep 30 18:15:39 2014
>> @@ -393,7 +393,8 @@ bool Resolver::checkUndefines() {
>>        foundUndefines = true;
>>        if (_context.printRemainingUndefines()) {
>>          llvm::errs() << "Undefined symbol: " << undefAtom->file().path()
>> -                     << ": " << undefAtom->name() << "\n";
>> +                     << ": " << _context.demangle(undefAtom->name())
>> +                     << "\n";
>>        }
>>      }
>>      if (foundUndefines) {
>> 
>> Modified: lld/trunk/lib/Driver/DarwinLdDriver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdDriver.cpp?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Driver/DarwinLdDriver.cpp (original)
>> +++ lld/trunk/lib/Driver/DarwinLdDriver.cpp Tue Sep 30 18:15:39 2014
>> @@ -425,6 +425,10 @@ bool DarwinLdDriver::parse(int argc, con
>>    if (parsedArgs->getLastArg(OPT_t))
>>      ctx.setLogInputFiles(true);
>>  +  // Handle -demangle option.
>> +  if (parsedArgs->getLastArg(OPT_demangle))
>> +    ctx.setDemangleSymbols(true);
>> +
>>    // Handle -keep_private_externs
>>    if (parsedArgs->getLastArg(OPT_keep_private_externs)) {
>>      ctx.setKeepPrivateExterns(true);
>> 
>> Modified: lld/trunk/lib/Driver/DarwinLdOptions.td
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdOptions.td?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Driver/DarwinLdOptions.td (original)
>> +++ lld/trunk/lib/Driver/DarwinLdOptions.td Tue Sep 30 18:15:39 2014
>> @@ -144,6 +144,8 @@ def sectalign : MultiArg<["-"], "sectali
>>       HelpText<"alignment for segment/section">;
>>  def image_base : Separate<["-"], "image_base">;
>>  def seg1addr : Separate<["-"], "seg1addr">, Alias<image_base>;
>> +def demangle : Flag<["-"], "demangle">,
>> +     HelpText<"Demangles symbol names in errors and warnings">;
>>    def t : Flag<["-"], "t">,
>>       HelpText<"Print the names of the input files as ld processes them">;
>> 
>> Modified: lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp?rev=218718&r1=218717&r2=218718&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp Tue Sep 30 18:15:39 2014
>> @@ -23,6 +23,7 @@
>>    #include "llvm/ADT/StringExtras.h"
>>  #include "llvm/ADT/Triple.h"
>> +#include "llvm/Config/config.h"
>>  #include "llvm/Support/Errc.h"
>>  #include "llvm/Support/Host.h"
>>  #include "llvm/Support/MachO.h"
>> @@ -30,6 +31,10 @@
>>    #include <algorithm>
>>  +#if HAVE_CXXABI_H
>> +#include <cxxabi.h>
>> +#endif
>> +
>>  using lld::mach_o::ArchHandler;
>>  using lld::mach_o::MachODylibFile;
>>  using namespace llvm::MachO;
>> @@ -137,7 +142,8 @@ MachOLinkingContext::MachOLinkingContext
>>        _osMinVersion(0), _pageZeroSize(0), _pageSize(4096), _baseAddress(0),
>>        _compatibilityVersion(0), _currentVersion(0), _deadStrippableDylib(false),
>>        _printAtoms(false), _testingFileUsage(false), _keepPrivateExterns(false),
>> -      _archHandler(nullptr), _exportMode(ExportMode::globals) {}
>> +      _demangle(false), _archHandler(nullptr),
>> +      _exportMode(ExportMode::globals) {}
>>    MachOLinkingContext::~MachOLinkingContext() {}
>>  @@ -659,5 +665,32 @@ bool MachOLinkingContext::exportSymbolNa
>>    llvm_unreachable("_exportMode unknown enum value");
>>  }
>>  +std::string MachOLinkingContext::demangle(StringRef symbolName) const {
>> +  // Only try to demangle symbols if -demangle on command line
>> +  if (!_demangle)
>> +    return symbolName;
>> +
>> +  // Only try to demangle symbols that look like C++ symbols
>> +  if (!symbolName.startswith("__Z"))
>> +    return symbolName;
>> +
>> +#if HAVE_CXXABI_H
>> +  SmallString<256> symBuff;
>> +  StringRef nullTermSym = Twine(symbolName).toNullTerminatedStringRef(symBuff);
>> +  // Mach-O has extra leading underscore that needs to be removed.
>> +  const char *cstr = nullTermSym.data() + 1;
>> +  int status;
>> +  char *demangled = abi::__cxa_demangle(cstr, nullptr, nullptr, &status);
>> +  if (demangled != NULL) {
>> +    std::string result(demangled);
>> +    // __cxa_demangle() always uses a malloc'ed buffer to return the result.
>> +    free(demangled);
>> +    return result;
>> +  }
>> +#endif
>> +
>> +  return symbolName;
>> +}
>> +
>>    } // end namespace lld
>> 
>> Added: lld/trunk/test/mach-o/demangle.yaml
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/demangle.yaml?rev=218718&view=auto
>> ==============================================================================
>> --- lld/trunk/test/mach-o/demangle.yaml (added)
>> +++ lld/trunk/test/mach-o/demangle.yaml Tue Sep 30 18:15:39 2014
>> @@ -0,0 +1,74 @@
>> +# REQUIRES: system-linker-mach-o
>> +#
>> +# RUN: not lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s  \
>> +# RUN:     -dylib -o %t %p/Inputs/libSystem.yaml  2> %t.err
>> +# RUN: FileCheck %s < %t.err
>> +#
>> +# RUN: not lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
>> +# RUN:     -dylib -o %t %p/Inputs/libSystem.yaml -demangle 2> %t.err2
>> +# RUN: FileCheck %s --check-prefix=DCHECK < %t.err2
>> +#
>> +# Test -demangle option works on undefined symbol errors.
>> +#
>> +
>> +--- !mach-o
>> +arch:            x86_64
>> +file-type:       MH_OBJECT
>> +flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
>> +sections:
>> +  - segment:         __TEXT
>> +    section:         __text
>> +    type:            S_REGULAR
>> +    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
>> +    address:         0x0000000000000000
>> +    content:         [ 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00,
>> +                       0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00 ]
>> +    relocations:
>> +      - offset:          0x0000000B
>> +        type:            X86_64_RELOC_BRANCH
>> +        length:          2
>> +        pc-rel:          true
>> +        extern:          true
>> +        symbol:          2
>> +      - offset:          0x00000006
>> +        type:            X86_64_RELOC_BRANCH
>> +        length:          2
>> +        pc-rel:          true
>> +        extern:          true
>> +        symbol:          3
>> +      - offset:          0x00000001
>> +        type:            X86_64_RELOC_BRANCH
>> +        length:          2
>> +        pc-rel:          true
>> +        extern:          true
>> +        symbol:          1
>> +global-symbols:
>> +  - name:            __Z1xv
>> +    type:            N_SECT
>> +    scope:           [ N_EXT ]
>> +    sect:            1
>> +    value:           0x0000000000000000
>> +undefined-symbols:
>> +  - name:            __Znam
>> +    type:            N_UNDF
>> +    scope:           [ N_EXT ]
>> +    value:           0x0000000000000000
>> +  - name:            __Znotcpp
>> +    type:            N_UNDF
>> +    scope:           [ N_EXT ]
>> +    value:           0x0000000000000000
>> +  - name:            _foo
>> +    type:            N_UNDF
>> +    scope:           [ N_EXT ]
>> +    value:           0x0000000000000000
>> +
>> +...
>> +
>> +# CHECK:  __Znotcpp
>> +# CHECK:  __Znam
>> +# CHECK:  _foo
>> +
>> +# DCHECK:  __Znotcpp
>> +# DCHECK: operator new[](unsigned long)
>> +# DCHECK:  _foo
>> +
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
> 
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation
> 





More information about the llvm-commits mailing list