diff options
author | Mike Stump <mrs@apple.com> | 2004-05-05 18:25:52 +0000 |
---|---|---|
committer | Mike Stump <mrs@gcc.gnu.org> | 2004-05-05 18:25:52 +0000 |
commit | e3c287c9f3141a97a75ea54ca9d99d940765d831 (patch) | |
tree | c90d3529878cc7887b1b4e333bac9bb10c41467a /gcc/config/darwin-c.c | |
parent | f08a3544c21fba472a946b93ad506d6469481311 (diff) | |
download | gcc-e3c287c9f3141a97a75ea54ca9d99d940765d831.zip gcc-e3c287c9f3141a97a75ea54ca9d99d940765d831.tar.gz gcc-e3c287c9f3141a97a75ea54ca9d99d940765d831.tar.bz2 |
darwin-c.c (add_framework): Copy the directory name as it can be freed later.
* config/darwin-c.c (add_framework): Copy the directory name as it
can be freed later. Also, ensure we always allocate enough room
for the cached framework information.
(find_subframework_header): Keep track of the directory where the
subframework header was found.
(framework_construct_pathname): Speed up by not trying to re-add a
framework.
* cppfiles.c (search_path_exhausted): Arrange for the missing
header callback to be able to set the directory where the header
was found.
(cpp_get_dir): Add.
* cpplib.h (missing_header_cb): Add a parameter.
(cpp_get_dir): Add.
From-SVN: r81534
Diffstat (limited to 'gcc/config/darwin-c.c')
-rw-r--r-- | gcc/config/darwin-c.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c index abe0a6b2..281d166 100644 --- a/gcc/config/darwin-c.c +++ b/gcc/config/darwin-c.c @@ -44,7 +44,8 @@ static void push_field_alignment (int); static void pop_field_alignment (void); static const char *find_subframework_file (const char *, const char *); static void add_system_framework_path (char *); -static const char *find_subframework_header (cpp_reader *pfile, const char *header); +static const char *find_subframework_header (cpp_reader *pfile, const char *header, + cpp_dir **dirp); typedef struct align_stack { @@ -166,11 +167,13 @@ static int max_frameworks = 0; /* Remember which frameworks have been seen, so that we can ensure that all uses of that framework come from the same framework. DIR is the place where the named framework NAME, which is of length - LEN, was found. */ + LEN, was found. We copy the directory name from NAME, as it will be + freed by others. */ static void add_framework (const char *name, size_t len, cpp_dir *dir) { + char *dir_name; int i; for (i = 0; i < num_frameworks; ++i) { @@ -183,10 +186,14 @@ add_framework (const char *name, size_t len, cpp_dir *dir) if (i >= max_frameworks) { max_frameworks = i*2; + max_frameworks += i == 0; frameworks_in_use = xrealloc (frameworks_in_use, max_frameworks*sizeof(*frameworks_in_use)); } - frameworks_in_use[num_frameworks].name = name; + dir_name = xmalloc (len + 1); + memcpy (dir_name, name, len); + dir_name[len] = '\0'; + frameworks_in_use[num_frameworks].name = dir_name; frameworks_in_use[num_frameworks].len = len; frameworks_in_use[num_frameworks].dir = dir; ++num_frameworks; @@ -272,7 +279,8 @@ framework_construct_pathname (const char *fname, cpp_dir *dir) if (stat (frname, &st) == 0) { - add_framework (fname, fname_len, dir); + if (fast_dir == 0) + add_framework (fname, fname_len, dir); return frname; } } @@ -445,7 +453,7 @@ darwin_register_frameworks (int stdinc) returns non-zero. */ static const char* -find_subframework_header (cpp_reader *pfile, const char *header) +find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp) { const char *fname = header; struct cpp_buffer *b; @@ -457,7 +465,14 @@ find_subframework_header (cpp_reader *pfile, const char *header) { n = find_subframework_file (fname, cpp_get_path (cpp_get_file (b))); if (n) - return n; + { + /* Logically, the place where we found the subframework is + the place where we found the Framework that contains the + subframework. This is useful for tracking wether or not + we are in a system header. */ + *dirp = cpp_get_dir (cpp_get_file (b)); + return n; + } } return 0; |