Subversion Repositories QNX 8.QNX8 linker driver

Rev

Rev 4 | Rev 7 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4 Rev 5
Line 132... Line 132...
132
      arraysize_var++; \
132
      arraysize_var++; \
133
   } while (0)
133
   } while (0)
134
   #define ADD_LINKER_ARG(val) ADD_CHAR_ARRAY (linker_argv, linker_argc, (val))
134
   #define ADD_LINKER_ARG(val) ADD_CHAR_ARRAY (linker_argv, linker_argc, (val))
135
   #define ADD_L_ARG(val) ADD_CHAR_ARRAY (largs, larg_count, (val))
135
   #define ADD_L_ARG(val) ADD_CHAR_ARRAY (largs, larg_count, (val))
136
   #define ADD_O_ARG(val) ADD_CHAR_ARRAY (oargs, oarg_count, (val))
136
   #define ADD_O_ARG(val) ADD_CHAR_ARRAY (oargs, oarg_count, (val))
-
 
137
   #define ADD_S_ARG(val) ADD_CHAR_ARRAY (sargs, sarg_count, (val))
137
   #define ARGV_CONTAINS_SINGLEARG(val)       ((arg = array_contains (argc, argv, (val), ARGMODE_SINGLE))   != NULL)
138
   #define ARGV_CONTAINS_SINGLEARG(val)       ((arg = array_contains (argc, argv, (val), ARGMODE_SINGLE))   != NULL)
138
   #define ARGV_CONTAINS_ARGWITHVAL(val)      ((arg = array_contains (argc, argv, (val), ARGMODE_HASVAL))   != NULL)
139
   #define ARGV_CONTAINS_ARGWITHVAL(val)      ((arg = array_contains (argc, argv, (val), ARGMODE_HASVAL))   != NULL)
139
   #define ARGV_CONTAINS_ARGWITHEQUALVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_EQUALVAL)) != NULL)
140
   #define ARGV_CONTAINS_ARGWITHEQUALVAL(val) ((arg = array_contains (argc, argv, (val), ARGMODE_EQUALVAL)) != NULL)
140
   #define ARGV_SINGLEARG(val)       array_contains (argc, argv, (val), ARGMODE_SINGLE)
141
   #define ARGV_SINGLEARG(val)       array_contains (argc, argv, (val), ARGMODE_SINGLE)
141
   #define ARGV_ARGWITHVAL(val)      array_contains (argc, argv, (val), ARGMODE_HASVAL)
142
   #define ARGV_ARGWITHVAL(val)      array_contains (argc, argv, (val), ARGMODE_HASVAL)
Line 144... Line 145...
144
   static char filebuf[1024 * 1024];
145
   static char filebuf[1024 * 1024];
145
   char **linker_argv = NULL;
146
   char **linker_argv = NULL;
146
   size_t linker_argc = 0;
147
   size_t linker_argc = 0;
147
   char **largs = NULL; // array of "-lxxx" arguments
148
   char **largs = NULL; // array of "-lxxx" arguments
148
   size_t larg_count = 0;
149
   size_t larg_count = 0;
-
 
150
   char **sargs = NULL; // array of source files arguments
-
 
151
   size_t sarg_count = 0;
149
   char **oargs = NULL; // array of object files arguments
152
   char **oargs = NULL; // array of object files arguments
150
   size_t oarg_count = 0;
153
   size_t oarg_count = 0;
151
   size_t read_count;
154
   size_t read_count;
152
   size_t byte_index;
155
   size_t byte_index;
153
   bool was_cpluspluslib_included = false;
156
   bool was_cpluspluslib_included = false;
154
   bool requires_libcplusplus = false;
157
   bool requires_libcplusplus = false;
155
   int arg_index;
158
   int arg_index;
156
   char *arg;
159
   char *arg;
157
   FILE *fp;
160
   FILE *fp;
158
 
161
 
-
 
162
   // if *any* of these flags are present, it means we don't want to link anything, so direct everything to the compiler
159
   if (   ARGV_CONTAINS_SINGLEARG ("-fsyntax-only")
163
   if (   ARGV_CONTAINS_SINGLEARG ("-fsyntax-only")
160
       || ARGV_CONTAINS_SINGLEARG ("-c")
164
       || ARGV_CONTAINS_SINGLEARG ("-c")
161
       || ARGV_CONTAINS_SINGLEARG ("-M")
165
       || ARGV_CONTAINS_SINGLEARG ("-M")
162
       || ARGV_CONTAINS_SINGLEARG ("-MM")
166
       || ARGV_CONTAINS_SINGLEARG ("-MM")
163
       || ARGV_CONTAINS_SINGLEARG ("-E")
167
       || ARGV_CONTAINS_SINGLEARG ("-E")
Line 165... Line 169...
165
   {
169
   {
166
      argv[0] = "clang";
170
      argv[0] = "clang";
167
      execvpe ("clang", argv, envp);
171
      execvpe ("clang", argv, envp);
168
   }
172
   }
169
 
173
 
170
   // collect object files
174
   // collect source files
171
   for (arg_index = 1; arg_index < argc; arg_index++)
175
   for (arg_index = 1; arg_index < argc; arg_index++)
172
      if ((strcmp (argv[arg_index - 1], "-o") != 0) // arg is NOT preceded by -o AND is an existing file that is NOT a known extension
176
      if ((strcmp (argv[arg_index - 1], "-o") != 0) // this arg is NOT preceded by "-o"...
173
          && (access (argv[arg_index], 0) == 0)
177
          && (access (argv[arg_index], 0) == 0) // ... this arg is an existing file...
174
          && ((arg = strrchr (argv[arg_index], '.')) != NULL)
178
          && ((arg = strrchr (argv[arg_index], '.')) != NULL)) // this filename has an extension (FIXME: what if "-x <language>" is specified?)
-
 
179
      {
175
          && (strcasecmp (arg, ".s") != 0)
180
         if (   (strcasecmp (arg, ".s") == 0)
176
          && (strcasecmp (arg, ".c") != 0)
181
             || (strcasecmp (arg, ".c") == 0)
177
          && (strcasecmp (arg, ".cc") != 0)
182
             || (strcasecmp (arg, ".cc") == 0)
178
          && (strcasecmp (arg, ".c++") != 0)
183
             || (strcasecmp (arg, ".c++") == 0)
179
          && (strcasecmp (arg, ".cpp") != 0)
184
             || (strcasecmp (arg, ".cpp") == 0)
180
          && (strcasecmp (arg, ".cxx") != 0)
185
             || (strcasecmp (arg, ".cxx") == 0)
181
          && (strcasecmp (arg, ".m") != 0)
186
             || (strcasecmp (arg, ".m") == 0)
182
          && (strcasecmp (arg, ".mm") != 0)
187
             || (strcasecmp (arg, ".mm") == 0)
183
          && (strcasecmp (arg, ".mxx") != 0)
188
             || (strcasecmp (arg, ".mxx") == 0))
-
 
189
            ADD_S_ARG (argv[arg_index]); // this file is one of the known source file extensions: add to source files list
184
          )
190
         else
185
         ADD_O_ARG (argv[arg_index]);
191
            ADD_O_ARG (argv[arg_index]); // this file is NOT one of the known file extensions: add to object files list
-
 
192
      }
186
 
193
 
-
 
194
   // if we have zero .o file, OR if we have some source files, we have to compile first
187
   if (oarg_count == 0)
195
   if ((sarg_count > 0) || (oarg_count == 0))
188
   {
196
   {
189
      argv[0] = "clang";
197
      argv[0] = "clang";
190
      execvpe ("clang", argv, envp);
198
      execvpe ("clang", argv, envp);
191
   }
199
   }
192
 
200