Manifest file is a separate or embedded XML file having metadata of an executable. As it is XML, it can contain various types of information. Probably the most popular one is to request escalated priviledges. Usually the linker creates an XML file and embed that file into an executable. However, there's a way to supply an XML file from command line. /manifestniput is it. Apparently it is over-designed here, but if you supply two or more manifest files, then the linker needs to merge the files into a single XML file. A good news is that we don't need to do that ourselves. MT.exe command can do that, so we call the command from the linker in this patch. llvm-svn: 266704
128 lines
4.9 KiB
TableGen
128 lines
4.9 KiB
TableGen
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 suffixed by ":no".
|
|
multiclass B<string name, string help> {
|
|
def "" : F<name>;
|
|
def _no : F<name#":no">, HelpText<help>;
|
|
}
|
|
|
|
def align : P<"align", "Section alignment">;
|
|
def alternatename : P<"alternatename", "Define weak alias">;
|
|
def base : P<"base", "Base address of the program">;
|
|
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 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 heap : P<"heap", "Size of the heap">;
|
|
def implib : P<"implib", "Import library name">;
|
|
def libpath : P<"libpath", "Additional library search path">;
|
|
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 out : P<"out", "Path to file to write output">;
|
|
def pdb : P<"pdb", "PDB file path">;
|
|
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 version : P<"version", "Specify a version number in the PE header">;
|
|
|
|
def disallowlib : Joined<["/", "-", "-?"], "disallowlib:">, Alias<nodefaultlib>;
|
|
|
|
def manifest : F<"manifest">;
|
|
def manifest_colon : P<"manifest", "Create manifest file">;
|
|
def manifestuac : P<"manifestuac", "User access control">;
|
|
def manifestfile : P<"manifestfile", "Manifest file path">;
|
|
def manifestdependency : P<"manifestdependency",
|
|
"Attributes for <dependency> in manifest file">;
|
|
def manifestinput : P<"manifestinput", "Specify manifest file">;
|
|
|
|
// 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 dll : F<"dll">, HelpText<"Create a DLL">;
|
|
def nodefaultlib_all : F<"nodefaultlib">;
|
|
def noentry : F<"noentry">;
|
|
def profile : F<"profile">;
|
|
def swaprun_cd : F<"swaprun:cd">;
|
|
def swaprun_net : F<"swaprun:net">;
|
|
def verbose : F<"verbose">;
|
|
|
|
def force : F<"force">,
|
|
HelpText<"Allow undefined symbols when creating executables">;
|
|
def force_unresolved : F<"force:unresolved">;
|
|
|
|
defm allowbind: B<"allowbind", "Disable DLL binding">;
|
|
defm allowisolation : B<"allowisolation", "Set NO_ISOLATION bit">;
|
|
defm dynamicbase : B<"dynamicbase",
|
|
"Disable address space layout randomization">;
|
|
defm fixed : B<"fixed", "Enable base relocations">;
|
|
defm highentropyva : B<"highentropyva", "Set HIGH_ENTROPY_VA bit">;
|
|
defm largeaddressaware : B<"largeaddressaware", "Disable large addresses">;
|
|
defm nxcompat : B<"nxcompat", "Disable data execution provention">;
|
|
defm safeseh : B<"safeseh", "Produce an image with Safe Exception Handler">;
|
|
defm tsaware : B<"tsaware", "Create non-Terminal Server aware executable">;
|
|
|
|
def help : F<"help">;
|
|
def help_q : Flag<["/?", "-?"], "">, Alias<help>;
|
|
|
|
// LLD extensions
|
|
def nosymtab : F<"nosymtab">;
|
|
|
|
// Flags for debugging
|
|
def lldmap : Joined<["/", "-"], "lldmap:">;
|
|
|
|
//==============================================================================
|
|
// The flags below do nothing. They are defined only for link.exe compatibility.
|
|
//==============================================================================
|
|
|
|
class QF<string name> : Joined<["/", "-", "-?"], name#":">;
|
|
|
|
multiclass QB<string name> {
|
|
def "" : F<name>;
|
|
def _no : F<name#":no">;
|
|
}
|
|
|
|
def functionpadmin : F<"functionpadmin">;
|
|
def ignoreidl : F<"ignoreidl">;
|
|
def incremental : F<"incremental">;
|
|
def no_incremental : F<"incremental:no">;
|
|
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 ignore : QF<"ignore">;
|
|
def maxilksize : QF<"maxilksize">;
|
|
def pdbaltpath : QF<"pdbaltpath">;
|
|
def tlbid : QF<"tlbid">;
|
|
def tlbout : QF<"tlbout">;
|
|
def verbose_all : QF<"verbose">;
|
|
def guardsym : QF<"guardsym">;
|
|
|
|
defm wx : QB<"wx">;
|