1 |
66 |
Agner |
/**************************** cmdline.h ***********************************
|
2 |
|
|
* Author: Agner Fog
|
3 |
|
|
* Date created: 2017-04-17
|
4 |
|
|
* Last modified: 2021-04-25
|
5 |
|
|
* Version: 1.11
|
6 |
|
|
* Project: Binary tools for ForwardCom instruction set
|
7 |
|
|
* Module: cmdline.h
|
8 |
|
|
* Description:
|
9 |
|
|
* Header file for command line interpreter cmdline.cpp
|
10 |
|
|
*
|
11 |
|
|
* Copyright 2006-2021 GNU General Public License http://www.gnu.org/licenses
|
12 |
|
|
*****************************************************************************/
|
13 |
|
|
#pragma once
|
14 |
|
|
|
15 |
|
|
/************************** Define constants ******************************/
|
16 |
|
|
// Max number of response files on command line
|
17 |
|
|
const int MAX_COMMAND_FILES = 10;
|
18 |
|
|
|
19 |
|
|
// Constants for output file type
|
20 |
|
|
const int CMDL_OUTPUT_DUMP = 0x80; // No output file, just dump contents
|
21 |
|
|
const int CMDL_OUTPUT_ELF = FILETYPE_ELF; // ELF file
|
22 |
|
|
const int CMDL_OUTPUT_ASM = FILETYPE_ASM; // Assembly file
|
23 |
|
|
|
24 |
|
|
// Constants for job
|
25 |
|
|
const int CMDL_JOB_ASS = 1; // Assemble
|
26 |
|
|
const int CMDL_JOB_DIS = 2; // Disassemble
|
27 |
|
|
const int CMDL_JOB_DUMP = 3; // Dump
|
28 |
|
|
const int CMDL_JOB_LINK = 4; // Link
|
29 |
|
|
const int CMDL_JOB_RELINK = 5; // Relink
|
30 |
|
|
const int CMDL_JOB_LIB = 6; // Library
|
31 |
|
|
const int CMDL_JOB_EMU = 8; // Emulate/Debug
|
32 |
|
|
const int CMDL_JOB_HELP = 0x1000; // Show help
|
33 |
|
|
|
34 |
|
|
// Constants for verbose or silent console output
|
35 |
|
|
const int CMDL_VERBOSE_NO = 0; // Silent. No console output if no errors or warnings
|
36 |
|
|
const int CMDL_VERBOSE_YES = 1; // Output messages about file names and types
|
37 |
|
|
const int CMDL_VERBOSE_DIAGNOSTICS = 2; // Output more messages
|
38 |
|
|
|
39 |
|
|
// Constants for dump options
|
40 |
|
|
const int DUMP_NONE = 0x0000; // Dump nothing
|
41 |
|
|
const int DUMP_LINKMAP = 0x0001; // Dump link map
|
42 |
|
|
const int DUMP_FILEHDR = 0x0002; // Dump file header
|
43 |
|
|
const int DUMP_SECTHDR = 0x0004; // Dump section headers
|
44 |
|
|
const int DUMP_SYMTAB = 0x0010; // Dump symbol table
|
45 |
|
|
const int DUMP_RELTAB = 0x0020; // Dump relocation table
|
46 |
|
|
const int DUMP_STRINGTB = 0x0040; // Dump string table
|
47 |
|
|
const int DUMP_COMMENT = 0x0080; // Dump comment records
|
48 |
|
|
const int DUMP_RELINKABLE = 0x0100; // Show names of relinkable modules and libraries
|
49 |
|
|
|
50 |
|
|
// Constants for file input/output options
|
51 |
|
|
const int CMDL_FILE_INPUT = 1; // Input file required
|
52 |
|
|
const int CMDL_FILE_SEARCH_PATH = 2; // Search for file in path
|
53 |
|
|
const int CMDL_FILE_IN_IF_EXISTS = 4; // Read input file if it exists
|
54 |
|
|
const int CMDL_FILE_OUTPUT = 0x10; // Write output file required
|
55 |
|
|
const int CMDL_FILE_IN_OUT_SAME = 0x20; // Input and output files may have the same name
|
56 |
|
|
const int CMDL_FILE_INCOMPLETE = 0x1000; // Allow output executable file to be incomplete, i.e. have unresolved references
|
57 |
|
|
const int CMDL_FILE_RELINKABLE = 0x10000; // Output executable file is relinkable
|
58 |
|
|
|
59 |
|
|
// Constants for library options
|
60 |
|
|
const int CMDL_LIBRARY_PRESERVEMEMBER = 1; // preserve object file in library
|
61 |
|
|
const int CMDL_LIBRARY_ADDMEMBER = 2; // add object file to library
|
62 |
|
|
const int CMDL_LIBRARY_DELETEMEMBER = 4; // delete object file to library
|
63 |
|
|
const int CMDL_LIBRARY_LISTMEMBERS = 8; // list library members
|
64 |
|
|
const int CMDL_LIBRARY_EXTRACTMEM = 0x100; // extract specified object file(s) from library
|
65 |
|
|
const int CMDL_LIBRARY_EXTRACTALL = 0x300; // extract all object files from library
|
66 |
|
|
|
67 |
|
|
// Constants for linker options
|
68 |
|
|
const int CMDL_LINK_EXEFILE = 1; // expecting executable file name
|
69 |
|
|
const int CMDL_LINK_ADDMODULE = 2; // add the following object files or library files
|
70 |
|
|
const int CMDL_LINK_ADDLIBRARY = 4; // add the following library files
|
71 |
|
|
const int CMDL_LINK_ADDLIBMODULE = 6; // add a member of a previously specified library
|
72 |
|
|
const int CMDL_LINK_EXTRACT = 8; // extract relinkable module
|
73 |
|
|
const int CMDL_LINK_REMOVE = 0x10; // remove relinkable modules
|
74 |
|
|
const int CMDL_LINK_REPLACE = 0x20; // replace relinkable modules
|
75 |
|
|
const int CMDL_LINK_LIST = 0x80; // list relinkable modules
|
76 |
|
|
const int CMDL_LINK_EXTRACT_ALL = 0x100; // extract all relinkable modules
|
77 |
|
|
const int CMDL_LINK_STACKSIZE = 0x200; // size of call stack, data stack, additional vectors
|
78 |
|
|
const int CMDL_LINK_HEAPSIZE = 0x400; // size of heap
|
79 |
|
|
const int CMDL_LINK_DYNLINKSIZE = 0x800; // extra size for dynamic linking: readonly, executable, writeable data
|
80 |
|
|
const int CMDL_LINK_RELINKABLE = 0x10000; // add as relinkable the following object files and library files
|
81 |
|
|
const int CMD_NAME_FOUND = 0x1000000; // mark name found in rnames record
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
// Structure for storing library or linker commands from command line
|
85 |
|
|
struct SLCommand {
|
86 |
|
|
uint32_t filename; // full file name, as index into cmd.fileNameBuffer
|
87 |
|
|
uint32_t command; // library commands or linker commands
|
88 |
|
|
uint64_t value; // value or library member name = filename without path
|
89 |
|
|
};
|
90 |
|
|
|
91 |
|
|
|
92 |
|
|
// Class for interpreting command line
|
93 |
|
|
class CCommandLineInterpreter {
|
94 |
|
|
public:
|
95 |
|
|
CCommandLineInterpreter(); // Default constructor
|
96 |
|
|
void readCommandLine(int argc, char * argv[]); // Read and interpret command line
|
97 |
|
|
void reportStatistics(); // Report statistics about name changes etc.
|
98 |
|
|
uint32_t inputFile; // Input file name. index into fileNameBuffer
|
99 |
|
|
uint32_t outputFile; // Output file name. index into fileNameBuffer
|
100 |
|
|
uint32_t instructionListFile; // File name of instruction list. index into fileNameBuffer
|
101 |
|
|
uint32_t outputListFile; // File name of assembler or emulator or linker output list file. index into fileNameBuffer
|
102 |
|
|
int job; // Job to do: ass, dis, dump, link, lib, emu
|
103 |
|
|
int inputType; // Input file type (detected from file)
|
104 |
|
|
int outputType; // Output type (file type or dump)
|
105 |
|
|
int optiLevel; // Optimization level (asm)
|
106 |
|
|
uint32_t maxErrors; // Maximum number of errors before assembler or emulator aborts
|
107 |
|
|
uint32_t maxLines; // Maximum number of lines in emulator output list
|
108 |
|
|
uint32_t verbose; // How much diagnostics to print on screen
|
109 |
|
|
uint32_t dumpOptions; // Options for dumping file
|
110 |
|
|
uint32_t fileOptions; // Options for input and output files
|
111 |
|
|
uint32_t libraryOptions; // Options for library operations
|
112 |
|
|
uint32_t linkOptions; // Options for linking
|
113 |
|
|
uint32_t debugOptions; // Options for debug info in assembly. not fully supported yet
|
114 |
|
|
uint64_t codeSizeOption; // Option specifying max code size
|
115 |
|
|
uint64_t dataSizeOption; // Option specifying max data size
|
116 |
|
|
const char * programName; // Path and name of this program
|
117 |
|
|
void checkExtractSuccess(); // Check if library members to extract were found
|
118 |
|
|
const char * getFilename(uint32_t n); // Get file name from index
|
119 |
|
|
int mainReturnValue; // Return value for program main
|
120 |
|
|
protected:
|
121 |
|
|
int libmode; // lib option has been encountered
|
122 |
|
|
int linkmode; // link option has been encountered
|
123 |
|
|
int emumode; // emulation option has been encountered
|
124 |
|
|
int numBuffers; // Number of response file buffers
|
125 |
|
|
void readCommandItem(char *); // Read one option from command line
|
126 |
|
|
void readCommandFile(char *); // Read commands from file
|
127 |
|
|
void interpretFileName(char *); // Interpret input or output filename from command line
|
128 |
|
|
void interpretCommandOption(char *); // Interpret one option from command line
|
129 |
|
|
void interpretAssembleOption(char *); // Interpret assemble option from command line
|
130 |
|
|
void interpretDisassembleOption(char *); // Interpret disassemble option from command line
|
131 |
|
|
void interpretLibraryCommand(char*string);// Interpret -lib command
|
132 |
|
|
void interpretLibraryOption(char*string); // Interpret library option from command line
|
133 |
|
|
void interpretLinkCommand(char * string); // Interpret -link command
|
134 |
|
|
void interpretLinkOption(char * string); // Interpret linking option from command line
|
135 |
|
|
void interpretEmulateOption(char *); // Interpret emulate option from command line
|
136 |
|
|
void interpretMaxErrorsOption(char * string); // Interpret maxerrors option from command line
|
137 |
|
|
void interpretCodeSizeOption(char * string); // Interpret codesize option from command line
|
138 |
|
|
void interpretDataSizeOption(char * string); // Interpret datasize option from command line
|
139 |
|
|
void interpretDebugOption(char * string); // Interpret debug option from command line
|
140 |
|
|
void interpretIlistOption(char *); // Interpret instruction list file option
|
141 |
|
|
void interpretListOption(char *); // Interpret output list file option for assembler
|
142 |
|
|
void interpretOptimizationOption(char *); // Interpret optimization option for assembler
|
143 |
|
|
void interpretStackOption(char *); // Interpret stack size option for linker
|
144 |
|
|
void interpretHeapOption(char *); // Interpret heap size option for linker
|
145 |
|
|
void interpretHexfileOption(char *); // Interpret hex file option for linker
|
146 |
|
|
void interpretDynlinkOption(char *); // Interpret dynamic link size option for linker
|
147 |
|
|
void interpretVerboseOption(char * string);// Interpret silent/verbose option from command line
|
148 |
|
|
void interpretDumpOption(char *); // Interpret dump option from command line
|
149 |
|
|
void interpretErrorOption(char *); // Interpret error option from command line
|
150 |
|
|
void interpretMaxLinesOption(char * string);// Interpret maxlines option from command line
|
151 |
|
|
void checkOutputFileName(); // Make output file name or check that requested name is valid
|
152 |
|
|
uint32_t setFileNameExtension(uint32_t fn, int filetype); // Set file name extension according to FileType
|
153 |
|
|
void help(); // Print help message
|
154 |
|
|
public:
|
155 |
|
|
CMemoryBuffer fileNameBuffer; // Buffer containing names of files from command line
|
156 |
|
|
CDynamicArray<SLCommand> lcommands; // List of linker or library commands from command line
|
157 |
|
|
};
|
158 |
|
|
|
159 |
|
|
int strncasecmp_(const char *s1, const char *s2, uint32_t n); // compare strings, ignore case for a-z
|
160 |
|
|
|
161 |
|
|
extern CCommandLineInterpreter cmd; // Command line interpreter
|
162 |
|
|
|
163 |
|
|
// operator < for sorting command line commands by name
|
164 |
|
|
static inline bool operator < (SLCommand const & a, SLCommand const & b) {
|
165 |
|
|
return strcmp(cmd.getFilename((uint32_t)a.value), cmd.getFilename((uint32_t)b.value)) < 0;
|
166 |
|
|
}
|