aboutsummaryrefslogtreecommitdiff
path: root/lld/COFF/Options.td
blob: 468e4da7d054dae111df53dd09e4af195fb66cc1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
include "llvm/Option/OptParser.td"

// link.exe accepts options starting with either a dash or a slash.

// Flag that takes no arguments.
class F<string name> : Flag<["/", "-", "/?", "-?"], name>;

// Flag that takes one argument after ":".
class P<string name, string help> :
      Joined<["/", "-", "/?", "-?"], name#":">, HelpText<help>;

// Boolean flag which can be suffixed by ":no". Using it unsuffixed turns the
// flag on and using it suffixed by ":no" turns it off.
multiclass B<string name, string help_on, string help_off> {
  def "" : F<name>, HelpText<help_on>;
  def _no : F<name#":no">, HelpText<help_off>;
}

def align   : P<"align", "Section alignment">;
def aligncomm : P<"aligncomm", "Set common symbol alignment">;
def alternatename : P<"alternatename", "Define weak alias">;
def base    : P<"base", "Base address of the program">;
def color_diagnostics: Flag<["--"], "color-diagnostics">,
    HelpText<"Use colors in diagnostics">;
def color_diagnostics_eq: Joined<["--"], "color-diagnostics=">,
    HelpText<"Use colors in diagnostics; one of 'always', 'never', 'auto'">;
def defaultlib : P<"defaultlib", "Add the library to the list of input files">;
def delayload : P<"delayload", "Delay loaded DLL name">;
def entry   : P<"entry", "Name of entry point symbol">;
def errorlimit : P<"errorlimit",
    "Maximum number of errors to emit before stopping (0 = no limit)">;
def export  : P<"export", "Export a function">;
// No help text because /failifmismatch is not intended to be used by the user.
def failifmismatch : P<"failifmismatch", "">;
def filealign : P<"filealign", "Section alignment in the output file">;
def functionpadmin : F<"functionpadmin">;
def functionpadmin_opt : P<"functionpadmin",
    "Prepares an image for hotpatching">;
def guard   : P<"guard", "Control flow guard">;
def heap    : P<"heap", "Size of the heap">;
def ignore : P<"ignore", "Specify warning codes to ignore">;
def implib  : P<"implib", "Import library name">;
def lib : F<"lib">,
    HelpText<"Act like lib.exe; must be first argument if present">;
def libpath : P<"libpath", "Additional library search path">;
def linkrepro : P<"linkrepro",
    "Dump linker invocation and input files for debugging">;
def lldignoreenv : F<"lldignoreenv">,
    HelpText<"Ignore environment variables like %LIB%">;
def lldltocache : P<"lldltocache",
    "Path to ThinLTO cached object file directory">;
def lldltocachepolicy : P<"lldltocachepolicy",
    "Pruning policy for the ThinLTO cache">;
def lldsavetemps : F<"lldsavetemps">,
    HelpText<"Save temporary files instead of deleting them">;
def machine : P<"machine", "Specify target platform">;
def merge   : P<"merge", "Combine sections">;
def mllvm   : P<"mllvm", "Options to pass to LLVM">;
def nodefaultlib : P<"nodefaultlib", "Remove a default library">;
def opt     : P<"opt", "Control optimizations">;
def order   : P<"order", "Put functions in order">;
def out     : P<"out", "Path to file to write output">;
def natvis : P<"natvis", "Path to natvis file to embed in the PDB">;
def no_color_diagnostics: F<"no-color-diagnostics">,
    HelpText<"Do not use colors in diagnostics">;
def pdb : P<"pdb", "PDB file path">;
def pdbaltpath : P<"pdbaltpath", "PDB file path to embed in the image">;
def section : P<"section", "Specify section attributes">;
def stack   : P<"stack", "Size of the stack">;
def stub    : P<"stub", "Specify DOS stub file">;
def subsystem : P<"subsystem", "Specify subsystem">;
def timestamp : P<"timestamp", "Specify the PE header timestamp">;
def version : P<"version", "Specify a version number in the PE header">;
def wholearchive_file : P<"wholearchive",
    "Include all object files from this library">;

def disallowlib : Joined<["/", "-", "/?", "-?"], "disallowlib:">,
    Alias<nodefaultlib>;

def manifest : F<"manifest">, HelpText<"Create .manifest file">;
def manifest_colon : P<
    "manifest",
    "NO disables manifest output; EMBED[,ID=#] embeds manifest as resource in the image">;
def manifestuac : P<"manifestuac", "User access control">;
def manifestfile : P<"manifestfile", "Manifest output path, with /manifest">;
def manifestdependency : P<
    "manifestdependency",
    "Attributes for <dependency> element in manifest file; implies /manifest">;
def manifestinput : P<
    "manifestinput",
    "Additional manifest inputs; only valid with /manifest:embed">;

// We cannot use multiclass P because class name "incl" is different
// from its command line option name. We do this because "include" is
// a reserved keyword in tablegen.
def incl : Joined<["/", "-", "/?", "-?"], "include:">,
    HelpText<"Force symbol to be added to symbol table as undefined one">;

// "def" is also a keyword.
def deffile : Joined<["/", "-", "/?", "-?"], "def:">,
    HelpText<"Use module-definition file">;

def debug : F<"debug">, HelpText<"Embed a symbol table in the image">;
def debug_opt : P<"debug", "Embed a symbol table in the image with option">;
def debugtype : P<"debugtype", "Debug Info Options">;
def dll : F<"dll">, HelpText<"Create a DLL">;
def driver : F<"driver">, HelpText<"Generate a Windows NT Kernel Mode Driver">;
def driver_wdm : F<"driver:wdm">,
    HelpText<"Set IMAGE_FILE_UP_SYSTEM_ONLY bit in PE header">;
def driver_uponly : F<"driver:uponly">,
    HelpText<"Set IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER bit in PE header">;
def driver_wdm_uponly : F<"driver:wdm,uponly">;
def driver_uponly_wdm : F<"driver:uponly,wdm">;
def nodefaultlib_all : F<"nodefaultlib">,
    HelpText<"Remove all default libraries">;
def noentry : F<"noentry">,
    HelpText<"Don't add reference to DllMainCRTStartup; only valid with /dll">;
def profile : F<"profile">;
def repro : F<"Brepro">,
    HelpText<"Use a hash of the executable as the PE header timestamp">;
def reproduce : P<"reproduce",
    "Dump linker invocation and input files for debugging">;
def swaprun : P<"swaprun",
  "Comma-separated list of 'cd' or 'net'">;
def swaprun_cd : F<"swaprun:cd">, Alias<swaprun>, AliasArgs<["cd"]>,
  HelpText<"Make loader run output binary from swap instead of from CD">;
def swaprun_net : F<"swaprun:net">, Alias<swaprun>, AliasArgs<["net"]>,
  HelpText<"Make loader run output binary from swap instead of from network">;
def verbose : F<"verbose">;
def wholearchive_flag : F<"wholearchive">,
    HelpText<"Include all object files from all libraries">;

def force : F<"force">,
    HelpText<"Allow undefined and multiply defined symbols">;
def force_unresolved : F<"force:unresolved">,
    HelpText<"Allow undefined symbols when creating executables">;
def force_multiple : F<"force:multiple">,
    HelpText<"Allow multiply defined symbols when creating executables">;
def force_multipleres : F<"force:multipleres">,
    HelpText<"Allow multiply defined resources when creating executables">;
defm WX : B<"WX", "Treat warnings as errors", "Don't treat warnings as errors">;

defm allowbind : B<"allowbind", "Enable DLL binding (default)",
                   "Disable DLL binding">;
defm allowisolation : B<"allowisolation", "Enable DLL isolation (default)",
                        "Disable DLL isolation">;
defm appcontainer : B<"appcontainer",
                      "Image can only be run in an app container",
                      "Image can run outside an app container (default)">;
defm dynamicbase : B<"dynamicbase", "Enable ASLR (default unless /fixed)",
                     "Disable ASLR (default when /fixed)">;
defm fixed : B<"fixed", "Disable base relocations",
               "Enable base relocations (default)">;
defm highentropyva : B<"highentropyva",
                       "Enable 64-bit ASLR (default on 64-bit)",
                       "Disable 64-bit ASLR">;
defm incremental : B<"incremental",
                     "Keep original import library if contents are unchanged",
                     "Overwrite import library even if contents are unchanged">;
defm integritycheck : B<"integritycheck",
                        "Set FORCE_INTEGRITY bit in PE header",
                        "No effect (default)">;
defm largeaddressaware : B<"largeaddressaware",
                           "Enable large addresses (default on 64-bit)",
                           "Disable large addresses (default on 32-bit)">;
defm nxcompat : B<"nxcompat", "Enable data execution prevention (default)",
                  "Disable data execution provention">;
defm safeseh : B<"safeseh",
                 "Produce an image with Safe Exception Handler (only for x86)",
                 "Don't produce an image with Safe Exception Handler">;
defm tsaware  : B<"tsaware",
                  "Create Terminal Server aware executable (default)",
                  "Create non-Terminal Server aware executable">;

def help : F<"help">;

// /?? and -?? must be before /? and -? to not confuse lib/Options.
def help_q : Flag<["/??", "-??", "/?", "-?"], "">, Alias<help>;

// LLD extensions
def end_lib : F<"end-lib">,
  HelpText<"Ends group of objects treated as if they were in a library">;
def exclude_all_symbols : F<"exclude-all-symbols">;
def export_all_symbols : F<"export-all-symbols">;
defm demangle : B<"demangle",
    "Demangle symbols in output (default)",
    "Do not demangle symbols in output">;
def include_optional : Joined<["/", "-", "/?", "-?"], "includeoptional:">,
    HelpText<"Add symbol as undefined, but allow it to remain undefined">;
def kill_at : F<"kill-at">;
def lldmingw : F<"lldmingw">;
def output_def : Joined<["/", "-", "/?", "-?"], "output-def:">;
def pdb_source_path : P<"pdbsourcepath",
    "Base path used to make relative source file path absolute in PDB">;
def rsp_quoting : Joined<["--"], "rsp-quoting=">,
  HelpText<"Quoting style for response files, 'windows' (default) or 'posix'">;
def start_lib : F<"start-lib">,
  HelpText<"Starts group of objects treated as if they were in a library">;
def thinlto_emit_imports_files :
    F<"thinlto-emit-imports-files">,
    HelpText<"Emit .imports files with -thinlto-index-only">;
def thinlto_index_only :
    F<"thinlto-index-only">,
    HelpText<"Instead of linking, emit ThinLTO index files">;
def thinlto_index_only_arg : P<
    "thinlto-index-only",
    "-thinlto-index-only and also write native module names to file">;
def thinlto_object_suffix_replace : P<
    "thinlto-object-suffix-replace",
    "'old;new' replace old suffix with new suffix in ThinLTO index">;
def thinlto_prefix_replace: P<
    "thinlto-prefix-replace",
    "'old;new' replace old prefix with new prefix in ThinLTO outputs">;
def lto_obj_path : P<
    "lto-obj-path",
    "output native object for merged LTO unit to this path">;
def dash_dash_version : Flag<["--"], "version">,
  HelpText<"Print version information">;
defm threads: B<"threads",
    "Run the linker multi-threaded (default)",
    "Do not run the linker multi-threaded">;

// Flags for debugging
def lldmap : F<"lldmap">;
def lldmap_file : Joined<["/", "-", "/?", "-?"], "lldmap:">;
def show_timing : F<"time">;
def summary : F<"summary">;

//==============================================================================
// The flags below do nothing. They are defined only for link.exe compatibility.
//==============================================================================

class QF<string name> : Joined<["/", "-", "/?", "-?"], name#":">;

def ignoreidl : F<"ignoreidl">;
def nologo : F<"nologo">;
def throwingnew : F<"throwingnew">;
def editandcontinue : F<"editandcontinue">;
def fastfail : F<"fastfail">;

def delay : QF<"delay">;
def errorreport : QF<"errorreport">;
def idlout : QF<"idlout">;
def maxilksize : QF<"maxilksize">;
def tlbid : QF<"tlbid">;
def tlbout : QF<"tlbout">;
def verbose_all : QF<"verbose">;
def guardsym : QF<"guardsym">;