//===- Options.td ---------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
include "llvm/Option/OptParser.td"

//===----------------------------------------------------------------------===//
// Dynamic
//===----------------------------------------------------------------------===//
def DynamicGroup : OptionGroup<"dynamic">,
                   HelpText<"DYNAMIC OPTIONS">;

def Entry : Joined<["--"], "entry=">,
            Group<DynamicGroup>,
            HelpText<"Use the explicit symbol as the entrance of your program">;
def EntryAlias : Separate<["-"], "e">,
                 Alias<Entry>;

def Bsymbolic : Flag<["-"], "Bsymbolic">,
                Group<DynamicGroup>,
                HelpText<"Bind references within the shared library">;

def Bgroup : Flag<["-"], "Bgroup">,
             Group<DynamicGroup>,
             HelpText<"Info the dynamic linker to lookup only inside the group">;

def SOName : Joined<["-"], "soname=">,
             Group<DynamicGroup>,
             HelpText<"Set internal name of shared library">;
def SONameAlias : Separate<["-"], "soname">,
                  Group<DynamicGroup>,
                  Alias<SOName>;

def NoUndef : Flag<["--"], "no-undefined">,
              Group<DynamicGroup>,
              HelpText<"Do not allow unresolved references">;

def AllowMulDefs : Flag<["--"], "allow-multiple-definition">,
                   Group<DynamicGroup>,
                   HelpText<"Allow multiple definitions">;

def Z : Separate<["-"], "z">,
        Group<DynamicGroup>,
        HelpText<"Extensions for GNU ld compatibility">;

def Dyld : Joined<["--"], "dynamic-linker=">,
           Group<DynamicGroup>,
           HelpText<"Set the name of the dynamic linker">;
def DyldAlias : Separate<["-"], "dynamic-linker">,
                Group<DynamicGroup>,
                Alias<Dyld>;

def EnableNewDTags : Flag<["--"], "enable-new-dtags">,
                     Group<DynamicGroup>,
                     HelpText<"Enable use of DT_RUNPATH and DT_FLAGS">;

def SpareDTags: Separate<["--"], "spare-dynamic-tags">,
                Group<DynamicGroup>,
                HelpText<"Set the number of spare dyanmic tags (DT_NULL)">;

//===----------------------------------------------------------------------===//
// Optimization
//===----------------------------------------------------------------------===//
def OptimizationGroup : OptionGroup<"optimization">,
                        HelpText<"OPTIMIZATION OPTIONS">;

def GCSections : Flag<["--"], "gc-sections">,
                 Group<OptimizationGroup>,
                 HelpText<"Enable garbage collection of unused input sections">;

def NoGCSections : Flag<["--"], "no-gc-sections">,
                   Group<OptimizationGroup>,
                   HelpText<"Disable garbage collection of unused input sections">;

def PrintGCSections : Flag<["--"], "print-gc-sections">,
                      Group<OptimizationGroup>,
                      HelpText<"List all sections removed by garbage collection">;

def NoPrintGCSections : Flag<["--"], "no-print-gc-sections">,
                        Group<OptimizationGroup>,
                        HelpText<"Do not list sections removed by garbage collection">;

def LDGeneratedUnwindInfo : Flag<["--"], "ld-generated-unwind-info">,
                            Group<OptimizationGroup>,
                            HelpText<"Request creation of unwind info for linker generated code sections like PLT">;

def NoLDGeneratedUnwindInfo : Flag<["--"], "no-ld-generated-unwind-info">,
                              Group<OptimizationGroup>,
                              HelpText<"Don't create unwind info for linker generated sections to save size">;

def ICF : Joined<["--"], "icf=">,
          Group<OptimizationGroup>,
          HelpText<"Identical Code Folding">;

def ICFIters : Separate<["--"], "icf-iterations">,
               Group<OptimizationGroup>,
               HelpText<"Set number of iterations to do ICF">;

def PrintICFSections : Flag<["--"], "print-icf-sections">,
                       Group<OptimizationGroup>,
                       HelpText<"List all sections folded by ICF">;

def NoPrintICFSections : Flag<["--"], "no-print-icf-sections">,
                         Group<OptimizationGroup>,
                         HelpText<"Do not list sections folded by ICF">;

//===----------------------------------------------------------------------===//
// Output
//===----------------------------------------------------------------------===//
def OutputGroup : OptionGroup<"output">,
                  HelpText<"OUTPUT OPTIONS">;

def Output : Separate<["-"], "o">,
             Group<OutputGroup>,
             HelpText<"Output filename">;
def OutputAlias : Joined<["--"], "output=">,
                  Group<OutputGroup>,
                  Alias<Output>;

def OutputFormat: Joined<["--"], "oformat=">,
                  Group<OutputGroup>,
                  HelpText<"Output format">;

def Shared : Flag<["-"], "shared">,
             Group<OutputGroup>,
             HelpText<"Create a shared library">;
def Bshareable : Flag<["-"], "Bshareable">,
                 Group<OutputGroup>,
                 Alias<Shared>;

def Bdynamic : Flag<["-"], "Bdynamic">,
               Group<OutputGroup>,
               HelpText<"Link against dynamic library">;
def BdynamicAlias1 : Flag<["-"], "dy">,
                     Group<OutputGroup>,
                     Alias<Bdynamic>;
def BdynamicAlias2 : Flag<["-"], "call_shared">,
                     Group<OutputGroup>,
                     Alias<Bdynamic>;

def Bstatic : Flag<["-"], "Bstatic">,
              Group<OutputGroup>,
              HelpText<"Link against static library">;
def BstaticAlias1 : Flag<["-"], "dn">,
                    Group<OutputGroup>,
                    Alias<Bstatic>;
def BstaticAlias2 : Flag<["-"], "non_shared">,
                    Group<OutputGroup>,
                    Alias<Bstatic>;
def BstaticAlias3 : Flag<["-"], "static">,
                    Group<OutputGroup>,
                    Alias<Bstatic>;

def PIE : Flag<["-"], "pie">,
          Group<OutputGroup>,
          HelpText<"Emit a position-independent executable file">;
def PICExec : Flag<["--"], "pic-executable">,
              Group<OutputGroup>,
              Alias<PIE>;

def Relocatable : Flag<["--"], "relocatable">,
                  Group<OutputGroup>,
                  HelpText<"Generate relocatable output">;
def RelocatableAlias : Flag<["-"], "r">,
                       Group<OutputGroup>,
                       Alias<Relocatable>;

def InputFormat : Joined<["--"], "format=">,
                  Group<OutputGroup>,
                  HelpText<"Specify the binary format for input object files that follow this option on the command line">;
def InputFormatAlias : Separate<["-"], "b">,
                       Group<OutputGroup>,
                       Alias<InputFormat>;

def StripDebug : Flag<["--"], "strip-debug">,
                 Group<OutputGroup>,
                 HelpText<"Omit debugger symbol information from the output file">;
def StripDebugAlias : Flag<["-"], "S">,
                      Group<OutputGroup>,
                      Alias<StripDebug>;

def StripAll : Flag<["--"], "strip-all">,
               Group<OutputGroup>,
               HelpText<"Omit all symbol information from the output file">;
def StripAllAlias : Flag<["-"], "s">,
                    Group<OutputGroup>,
                    Alias<StripAll>;

def DiscardLocals : Flag<["--"], "discard-debug">,
                    Group<OutputGroup>,
                    HelpText<"Discard all temporary local symbols">;
def DiscardLocalsAlias : Flag<["-"], "X">,
                         Group<OutputGroup>,
                         Alias<DiscardLocals>;

def DiscardAll : Flag<["--"], "discard-all">,
                 Group<OutputGroup>,
                 HelpText<"Discard all local symbols">;
def DiscardAllAlias : Flag<["-"], "x">,
                      Group<OutputGroup>,
                      Alias<DiscardAll>;

def EHFrameHdr : Flag<["--"], "eh-frame-hdr">,
                 Group<OutputGroup>,
                 HelpText<"Request creation of .eh_frame_hdr section and PT_GNU_EH_FRAME segment">;

def NMagic : Flag<["--"], "nmagic">,
             Group<OutputGroup>,
             HelpText<"Do not page align data">;
def NMagicAlias : Flag<["-"], "n">,
                  Group<OutputGroup>,
                  Alias<NMagic>;

def OMagic : Flag<["--"], "omagic">,
             Group<OutputGroup>,
             HelpText<"Do not page align data, do not make text readonly">;
def OMagicAlias : Flag<["-"], "N">,
                  Group<OutputGroup>,
                  Alias<OMagic>;

def HashStyle : Joined<["--"], "hash-style=">,
                Group<OutputGroup>,
                HelpText<"Set the type of linker's hash table(s)">;

def ExportDynamic : Flag<["--"], "export-dynamic">,
                    Group<OutputGroup>,
                    HelpText<"Export all dynamic symbols">;
def ExportDynamicAlias : Flag<["-"], "E">,
                         Group<OutputGroup>,
                         Alias<ExportDynamic>;

def NoExportDynamic : Flag<["--"], "no-export-dynamic">,
                   Group<OutputGroup>,
                   HelpText<"Not export all dynamic symbols">;



def NoWarnMismatch : Flag<["--"], "no-warn-mismatch">,
                     Group<OutputGroup>,
                     HelpText<"Allow linking together mismatched input files">;

def ExcludeLibs : Separate<["--"], "exclude-libs">,
                  Group<OutputGroup>,
                  HelpText<"Allow linking together mismatched input files">;

//===----------------------------------------------------------------------===//
// Positional
//===----------------------------------------------------------------------===//
def PositionalGroup : OptionGroup<"positional">,
                      HelpText<"POSITIONAL OPTIONS">;

def Script : Joined<["--"], "script=">,
             Group<PositionalGroup>,
             HelpText<"Use the given file as the linker script">;
def ScriptAlias : Separate<["-"], "T">,
                  Group<PositionalGroup>,
                  Alias<Script>;

def Namespec : Joined<["--"], "library=">,
               Group<PositionalGroup>,
               HelpText<"Add the archive or object file specified by namespec to the list of files to link">;
def NamespecAlias : Joined<["-"], "l">,
                    Group<PositionalGroup>,
                    Alias<Namespec>;

def WholeArchive : Flag<["--"], "whole-archive">,
                   Group<PositionalGroup>,
                   HelpText<"Include every object file in the archive in the link">;

def NoWholeArchive : Flag<["--"], "no-whole-archive">,
                     Group<PositionalGroup>,
                     HelpText<"Turn off the effect of the --whole-archive option">;

def AsNeeded : Flag<["--"], "as-needed">,
               Group<PositionalGroup>,
               HelpText<"Add the dynamic libraries mentioned to DT_NEEDED where there is "
                        "a non-weak undefined symbol reference from">;

def NoAsNeeded : Flag<["--"], "no-as-needed">,
                 Group<PositionalGroup>,
                 HelpText<"Turn off the effect of the --as-needed">;

def AddNeeded : Flag<["--"], "add-needed">,
                Group<PositionalGroup>,
                HelpText<"Deprecated">;

def NoAddNeeded : Flag<["--"], "no-add-needed">,
                  Group<PositionalGroup>,
                  HelpText<"Deprecated">;

def CopyDTNeeded : Flag<["--"], "copy-dt-needed-entries">,
                   Group<PositionalGroup>,
                   HelpText<"Add the dynamic libraries mentioned to DT_NEEDED">;

def NoCopyDTNeeded : Flag<["--"], "no-copy-dt-needed-entries">,
                     Group<PositionalGroup>,
                     HelpText<"Turn off the effect of the --copy-dt-needed-entries">;

def StartGroup : Flag<["--"], "start-group">,
                 Group<PositionalGroup>,
                 HelpText<"Start to record a group of archives">;
def StartGroupAlias : Flag<["-"], "(">,
                      Group<PositionalGroup>,
                      Alias<StartGroup>;

def EndGroup : Flag<["--"], "end-group">,
               Group<PositionalGroup>,
               HelpText<"Stop recording a group of archives">;
def EndGroupAlias : Flag<["-"], ")">,
                    Group<PositionalGroup>,
                    Alias<EndGroup>;

//===----------------------------------------------------------------------===//
// Preference
//===----------------------------------------------------------------------===//
def PreferenceGroup : OptionGroup<"preference">,
                      HelpText<"PREFERENCE OPTIONS">;

def Color : Joined<["--"], "color=">,
            Group<PreferenceGroup>,
            HelpText<"Surround the result strings with the marker">;

def Trace : Flag<["--"], "trace">,
            Group<PreferenceGroup>,
            HelpText<"Print the names of the input files as ld processes them">;
def TraceAlias : Flag<["-"], "t">,
                 Group<PreferenceGroup>,
                 Alias<Trace>;

def Help : Flag<["-", "--"], "help">,
           Group<PreferenceGroup>,
           HelpText<"Display available options (to standard output)">;
def HelpAlias : Flag<["-"], "h">,
                Group<PreferenceGroup>,
                Alias<Help>;

def Verbose : Joined<["--"], "verbose=">,
              Group<PreferenceGroup>,
              HelpText<"Set linker diagnostic output level">;

def Version : Flag<["--"], "version">,
              Group<PreferenceGroup>,
              HelpText<"Display MCLinker version">;
def VersionAlias1 : Flag<["-"], "v">,
                    Group<PreferenceGroup>,
                    Alias<Version>;
def VersionAlias2 : Flag<["-"], "V">,
                    Group<PreferenceGroup>,
                    Alias<Version>;

def ErrorLimit : Joined<["--"], "error-limit=">,
                 Group<PreferenceGroup>,
                 HelpText<"Set the maximum limit of errors">;

def WarningLimit : Joined<["--"], "warning-limit=">,
                   Group<PreferenceGroup>,
                   HelpText<"Set the maximum limit of warnings">;

def FatalWarnings : Flag<["--"], "fatal-warnings">,
                    Group<PreferenceGroup>,
                    HelpText<"Turn all warnings into errors">;

def NoFatalWarnings : Flag<["--"], "no-fatal-warnings">,
                      Group<PreferenceGroup>,
                      HelpText<"Do not turn all warnings into errors">;

def WarnSharedTextrel : Flag<["--"], "warn-shared-textrel">,
                        Group<PreferenceGroup>,
                        HelpText<"Warn if there is a text relocation in the output shared object">;

//===----------------------------------------------------------------------===//
// Script
//===----------------------------------------------------------------------===//
def ScriptGroup : OptionGroup<"script">,
                  HelpText<"SCRIPT OPTIONS">;

def DefSym : Joined<["--"], "defsym=">,
             Group<ScriptGroup>,
             HelpText<"Define a symbol">;

def Wrap : Joined<["--"], "wrap=">,
           Group<ScriptGroup>,
           HelpText<"Use a wrap function for the symbol">;

def Portable : Joined<["--"], "portable=">,
               Group<ScriptGroup>,
               HelpText<"Use a portable function for the symbol">;

def SectionStart : Joined<["--"], "section-start=">,
                   Group<ScriptGroup>,
                   HelpText<"Locate a output section at the given absolute address">;

def Tbss : Joined<["-"], "Tbss=">,
           Group<ScriptGroup>,
           HelpText<"Set the address of the bss segment">;

def Tdata : Joined<["-"], "Tdata=">,
            Group<ScriptGroup>,
            HelpText<"Set the address of the data segment">;

def Ttext : Joined<["-"], "Ttext=">,
            Group<ScriptGroup>,
            HelpText<"Set the address of the text segment">;

//===----------------------------------------------------------------------===//
// Search Path
//===----------------------------------------------------------------------===//
def SearchpathGroup : OptionGroup<"searchpath">,
                      HelpText<"SEARCHPATH OPTIONS">;

def Sysroot : Joined<["--"], "sysroot=">,
              Group<SearchpathGroup>,
              HelpText<"Use the given directory as the location of the sysroot">;

def LibraryPath : Joined<["--"], "library-path=">,
                  Group<SearchpathGroup>,
                  HelpText<"Add the given directory to the list of search paths">;
def LibraryPathAlias : Joined<["-"], "L">,
                       Group<SearchpathGroup>,
                       Alias<LibraryPath>;

def NoStdlib : Flag<["-"], "nostdlib">,
               Group<SearchpathGroup>,
               HelpText<"Only search lib dirs explicitly specified on cmdline">;

def RPath : Joined<["-"], "rpath=">,
            Group<SearchpathGroup>,
            HelpText<"Add a directory to the runtime library search path">;

//===----------------------------------------------------------------------===//
// Symbol
//===----------------------------------------------------------------------===//
def SymbolGroup : OptionGroup<"symbol">,
                  HelpText<"SYMBOL OPTIONS">;

def Undefined : Joined<["--"], "undefined=">,
                Group<SymbolGroup>,
                HelpText<"Force symbol to be undefined in the output file">;
def UndefinedAlias : Separate<["-"], "u">,
                     Group<SymbolGroup>,
                     Alias<Undefined>;

def DefineCommon : Flag<["-"], "d">,
                   Group<SymbolGroup>,
                   HelpText<"Define common symbol">;
def DefineCommonAlias1 : Flag<["-"], "dc">,
                         Group<SymbolGroup>,
                         Alias<DefineCommon>;
def DefineCommonAlias2 : Flag<["-"], "dp">,
                         Group<SymbolGroup>,
                         Alias<DefineCommon>;

//===----------------------------------------------------------------------===//
// Target
//===----------------------------------------------------------------------===//
def TargetGroup : OptionGroup<"target">,
                  HelpText<"TARGET OPTIONS">;

def GPSize : Joined<["--"], "gpsize=">,
             Group<TargetGroup>,
             HelpText<"Set the maximum size of objects to be optimized using GP">;
def GPSizeAlias : Separate<["-"], "G">,
                  Group<TargetGroup>,
                  Alias<GPSize>;

def Triple : Joined<["-"], "mtriple=">,
             Group<TargetGroup>,
             HelpText<"Override target triple for module">;

def Arch : Joined<["-"], "march=">,
           Group<TargetGroup>,
           HelpText<"Architecture to generate code for">;

def CPU : Joined<["-"], "mcpu=">,
          Group<TargetGroup>,
          HelpText<"Set a specific cpu type">;

def Emulation : Separate<["-"], "m">,
                Group<TargetGroup>,
                HelpText<"Set GNU linker emulation">;

def StubGroupSize : Joined<["--"], "stub-group-size=">,
                    Group<TargetGroup>,
                    HelpText<"Set the group size to place stubs between sections">;

def FixCA53Erratum835769 : Flag<["--"], "fix-cortex-a53-835769">,
                           Group<TargetGroup>,
                           HelpText<"Enable fix for cortex a53 erratum 835769">;

def FixCA53Erratum843419 : Flag<["--"], "fix-cortex-a53-843419">,
                           Group<TargetGroup>,
                           HelpText<"Enable fix for cortex a53 erratum 843419">;