[lld] r237841 - [LLD] Add support for the -stack_size option to Darwin ld.

Lang Hames lhames at gmail.com
Wed May 20 15:31:43 PDT 2015


This commit had an out-of-order-initialization issue in the constructor for
MachOLinkingContext which caused a failure on some buildbots. This has been
fixed in r237842.

- Lang.

On Wed, May 20, 2015 at 3:10 PM, Lang Hames <lhames at gmail.com> wrote:

> Author: lhames
> Date: Wed May 20 17:10:50 2015
> New Revision: 237841
>
> URL: http://llvm.org/viewvc/llvm-project?rev=237841&view=rev
> Log:
> [LLD] Add support for the -stack_size option to Darwin ld.
>
> Added:
>     lld/trunk/test/mach-o/stack-size.yaml
> Modified:
>     lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
>     lld/trunk/lib/Driver/DarwinLdDriver.cpp
>     lld/trunk/lib/Driver/DarwinLdOptions.td
>     lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFile.h
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp
>
> Modified: lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h (original)
> +++ lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h Wed May 20
> 17:10:50 2015
> @@ -129,6 +129,9 @@ public:
>    bool PIE() const { return _pie; }
>    void setPIE(bool pie) { _pie = pie; }
>
> +  uint64_t stackSize() const { return _stackSize; }
> +  void setStackSize(uint64_t stackSize) { _stackSize = stackSize; }
> +
>    uint64_t baseAddress() const { return _baseAddress; }
>    void setBaseAddress(uint64_t baseAddress) { _baseAddress = baseAddress;
> }
>
> @@ -332,6 +335,7 @@ private:
>    bool _outputMachOTypeStatic; // Disambiguate static vs dynamic prog
>    bool _doNothing;            // for -help and -v which just print info
>    bool _pie;
> +  uint64_t _stackSize;
>    Arch _arch;
>    OS _os;
>    uint32_t _osMinVersion;
>
> Modified: lld/trunk/lib/Driver/DarwinLdDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdDriver.cpp?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Driver/DarwinLdDriver.cpp (original)
> +++ lld/trunk/lib/Driver/DarwinLdDriver.cpp Wed May 20 17:10:50 2015
> @@ -20,6 +20,7 @@
>  #include "lld/ReaderWriter/MachOLinkingContext.h"
>  #include "llvm/ADT/ArrayRef.h"
>  #include "llvm/ADT/STLExtras.h"
> +#include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/Triple.h"
>  #include "llvm/Option/Arg.h"
>  #include "llvm/Option/Option.h"
> @@ -411,7 +412,7 @@ bool DarwinLdDriver::parse(int argc, con
>        return false;
>      } else if (baseAddress % ctx.pageSize()) {
>        diagnostics << "error: image_base must be a multiple of page size ("
> -                  << llvm::format("0x%" PRIx64, ctx.pageSize()) << ")\n";
> +                  << "0x" << llvm::utohexstr(ctx.pageSize()) << ")\n";
>        return false;
>      }
>
> @@ -720,6 +721,22 @@ bool DarwinLdDriver::parse(int argc, con
>      }
>    }
>
> +  // Handle stack_size
> +  if (llvm::opt::Arg *stackSize = parsedArgs->getLastArg(OPT_stack_size))
> {
> +    uint64_t stackSizeVal;
> +    if (parseNumberBase16(stackSize->getValue(), stackSizeVal)) {
> +      diagnostics << "error: stack_size expects a hex number\n";
> +      return false;
> +    }
> +    if ((stackSizeVal % ctx.pageSize()) != 0) {
> +      diagnostics << "error: stack_size must be a multiple of page size ("
> +                  << "0x" << llvm::utohexstr(ctx.pageSize()) << ")\n";
> +      return false;
> +    }
> +
> +    ctx.setStackSize(stackSizeVal);
> +  }
> +
>    // Handle debug info handling options: -S
>    if (parsedArgs->hasArg(OPT_S))
>      ctx.setDebugInfoMode(MachOLinkingContext::DebugInfoMode::noDebugMap);
>
> Modified: lld/trunk/lib/Driver/DarwinLdOptions.td
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdOptions.td?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Driver/DarwinLdOptions.td (original)
> +++ lld/trunk/lib/Driver/DarwinLdOptions.td Wed May 20 17:10:50 2015
> @@ -67,6 +67,10 @@ def pie : Flag<["-"], "pie">,
>  def no_pie : Flag<["-"], "no_pie">,
>       HelpText<"Do not create Position Independent Executable">,
>       Group<grp_main>;
> +def stack_size : Separate<["-"], "stack_size">,
> +     HelpText<"Specifies the maximum stack size for the main thread in a
> program. "
> +              "Must be a page-size multiple. (default=8Mb)">,
> +     Group<grp_main>;
>
>  // dylib executable options
>  def grp_dylib : OptionGroup<"opts">, HelpText<"DYLIB EXECUTABLE OPTIONS">;
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp Wed May 20
> 17:10:50 2015
> @@ -142,9 +142,9 @@ MachOLinkingContext::MachOLinkingContext
>      : _outputMachOType(MH_EXECUTE), _outputMachOTypeStatic(false),
>        _doNothing(false), _pie(false), _arch(arch_unknown),
> _os(OS::macOSX),
>        _osMinVersion(0), _pageZeroSize(0), _pageSize(4096),
> _baseAddress(0),
> -      _compatibilityVersion(0), _currentVersion(0),
> _deadStrippableDylib(false),
> -      _printAtoms(false), _testingFileUsage(false),
> _keepPrivateExterns(false),
> -      _demangle(false), _archHandler(nullptr),
> +      _stackSize(0x800000), _compatibilityVersion(0), _currentVersion(0),
> +      _deadStrippableDylib(false), _printAtoms(false),
> _testingFileUsage(false),
> +      _keepPrivateExterns(false), _demangle(false), _archHandler(nullptr),
>        _exportMode(ExportMode::globals),
>        _debugInfoMode(DebugInfoMode::addDebugMap), _orderFileEntries(0) {}
>
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFile.h?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFile.h (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFile.h Wed May 20
> 17:10:50 2015
> @@ -235,6 +235,7 @@ struct NormalizedFile {
>    bool                        hasUUID;
>    std::vector<StringRef>      rpaths;
>    Hex64                       entryAddress;
> +  Hex64                       stackSize;
>    MachOLinkingContext::OS     os;
>    Hex64                       sourceVersion;
>    PackedVersion               minOSverson;
>
> Modified:
> lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
> (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
> Wed May 20 17:10:50 2015
> @@ -829,7 +829,7 @@ std::error_code MachOFileLayout::writeLo
>        ep->cmd       = LC_MAIN;
>        ep->cmdsize   = sizeof(entry_point_command);
>        ep->entryoff  = _file.entryAddress - _seg1addr;
> -      ep->stacksize = 0;
> +      ep->stacksize = _file.stackSize;
>        if (_swap)
>          swapStruct(*ep);
>        lc += sizeof(entry_point_command);
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
> (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp Wed
> May 20 17:10:50 2015
> @@ -1197,6 +1197,7 @@ normalizedFromAtoms(const lld::File &ato
>    normFile.arch = context.arch();
>    normFile.fileType = context.outputMachOType();
>    normFile.flags = util.fileFlags();
> +  normFile.stackSize = context.stackSize();
>    normFile.installName = context.installName();
>    normFile.currentVersion = context.currentVersion();
>    normFile.compatVersion = context.compatibilityVersion();
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp?rev=237841&r1=237840&r2=237841&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileYAML.cpp Wed May
> 20 17:10:50 2015
> @@ -688,6 +688,7 @@ struct MappingTraits<NormalizedFile> {
>      io.mapOptional("has-UUID",         file.hasUUID,        true);
>      io.mapOptional("rpaths",           file.rpaths);
>      io.mapOptional("entry-point",      file.entryAddress,   Hex64(0));
> +    io.mapOptional("stack-size",       file.stackSize,
> Hex64(0x800000));
>      io.mapOptional("source-version",   file.sourceVersion,  Hex64(0));
>      io.mapOptional("OS",               file.os);
>      io.mapOptional("min-os-version",   file.minOSverson,
> PackedVersion(0));
>
> Added: lld/trunk/test/mach-o/stack-size.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/stack-size.yaml?rev=237841&view=auto
>
> ==============================================================================
> --- lld/trunk/test/mach-o/stack-size.yaml (added)
> +++ lld/trunk/test/mach-o/stack-size.yaml Wed May 20 17:10:50 2015
> @@ -0,0 +1,19 @@
> +# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.9 %s -o %t
> -stack_size 31415926000 %p/Inputs/libSystem.yaml
> +# RUN: llvm-objdump -private-headers %t | FileCheck %s
> +# RUN: not lld -flavor darwin -arch x86_64 -stack_size 0x31415926530 %s
> >/dev/null 2> %t
> +# RUN: FileCheck < %t %s --check-prefix=CHECK-ERROR-MISPAGED
> +# RUN: not lld -flavor darwin -arch x86_64 -stack_size hithere %s
> >/dev/null 2> %t
> +# RUN: FileCheck < %t %s --check-prefix=CHECK-ERROR-NOTHEX
> +
> +--- !native
> +defined-atoms:
> +   - name:            _main
> +     scope:           global
> +     content:         []
> +
> +# CHECK:       cmd LC_MAIN
> +# CHECK: stacksize 3384796143616
> +
> +# CHECK-ERROR-MISPAGED: error: stack_size must be a multiple of page size
> (0x1000)
> +
> +# CHECK-ERROR-NOTHEX: error: stack_size expects a hex number
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150520/56fe9770/attachment.html>


More information about the llvm-commits mailing list