mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-30 07:04:42 +08:00
configure.in (AC_CHECK_FUNCS): Add checks for scandir and alphasort.
* configure.in (AC_CHECK_FUNCS): Add checks for scandir and alphasort. * config.in: Regenerated. * configure: Regenerated. From-SVN: r53633
This commit is contained in:
parent
a1ab4696ab
commit
a15135c91a
@ -1,3 +1,10 @@
|
||||
2002-05-18 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* configure.in (AC_CHECK_FUNCS): Add checks for scandir and
|
||||
alphasort.
|
||||
* config.in: Regenerated.
|
||||
* configure: Regenerated.
|
||||
|
||||
2002-05-19 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* target-def.h (TARGET_BINDS_LOCAL_P): New.
|
||||
|
@ -93,6 +93,9 @@
|
||||
/* Define if you have the __argz_stringify function. */
|
||||
#undef HAVE___ARGZ_STRINGIFY
|
||||
|
||||
/* Define if you have the alphasort function. */
|
||||
#undef HAVE_ALPHASORT
|
||||
|
||||
/* Define if you have the atoll function. */
|
||||
#undef HAVE_ATOLL
|
||||
|
||||
@ -171,6 +174,9 @@
|
||||
/* Define if you have the putenv function. */
|
||||
#undef HAVE_PUTENV
|
||||
|
||||
/* Define if you have the scandir function. */
|
||||
#undef HAVE_SCANDIR
|
||||
|
||||
/* Define if you have the setenv function. */
|
||||
#undef HAVE_SETENV
|
||||
|
||||
|
335
gcc/configure
vendored
335
gcc/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -614,7 +614,8 @@ dnl gcc_AC_C_ENUM_BF_UNSIGNED
|
||||
|
||||
AC_CHECK_FUNCS(times clock dup2 kill getrlimit setrlimit atoll atoq \
|
||||
sysconf strsignal putc_unlocked fputc_unlocked fputs_unlocked \
|
||||
fwrite_unlocked fprintf_unlocked getrusage nl_langinfo lstat)
|
||||
fwrite_unlocked fprintf_unlocked getrusage nl_langinfo lstat \
|
||||
scandir alphasort)
|
||||
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
|
||||
|
@ -1,3 +1,23 @@
|
||||
2002-05-18 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* gjavah.c (throwable_p): Do not free the name of the class after
|
||||
passing it to find_class.
|
||||
* java-tree.h (CLASS_BEING_LAIDOUT): Remove duplicate definition.
|
||||
* jcf-io.c (dirent.h): Include it.
|
||||
(fnmatch.h): Likewise.
|
||||
(compare_path): New function.
|
||||
(java_or_class_file): Likewise.
|
||||
(memoized_dirlist_entry): New type.
|
||||
(memoized_dirlist_lookup_eq): New function.
|
||||
(memoized_dirlists): New variable.
|
||||
(caching_stat): New function.
|
||||
(memoized_class_lookup_eq): New function.
|
||||
(memoized_class_lookups): Likewise.
|
||||
(find_class): Use memoized_class_lookups and caching_stat.
|
||||
* jcf.h (JCF_USE_SCANDIR): Define.
|
||||
* parse.y (java_expand_classes): Write the class files in reverse
|
||||
order.
|
||||
|
||||
2002-05-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
|
||||
|
||||
* Make-lang.in: Allow for PWDCMD to override hardcoded pwd.
|
||||
|
@ -1194,8 +1194,6 @@ throwable_p (signature)
|
||||
JCF_FINISH (&jcf);
|
||||
}
|
||||
|
||||
if (current)
|
||||
free (current);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1440,11 +1440,6 @@ extern tree *type_map;
|
||||
layout of a class. */
|
||||
#define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE)
|
||||
|
||||
/* True if class TYPE is currently being laid out. Helps in detection
|
||||
of inheritance cycle occurring as a side effect of performing the
|
||||
layout of a class. */
|
||||
#define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE)
|
||||
|
||||
/* True if class TYPE has a field initializer finit$ function */
|
||||
#define CLASS_HAS_FINIT_P(TYPE) TYPE_FINIT_STMT_LIST (TYPE)
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Utility routines for finding and reading Java(TM) .class files.
|
||||
Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -29,6 +29,11 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
|
||||
#include "tree.h"
|
||||
#include "toplev.h"
|
||||
#include "java-tree.h"
|
||||
#include "hashtab.h"
|
||||
#if JCF_USE_SCANDIR
|
||||
#include <dirent.h>
|
||||
#include <fnmatch.h>
|
||||
#endif
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
@ -304,10 +309,152 @@ DEFUN(find_classfile, (filename, jcf, dep_name),
|
||||
#endif
|
||||
}
|
||||
|
||||
#if JCF_USE_SCANDIR
|
||||
|
||||
/* A comparison function (as for qsort) that compares KEY (a char *
|
||||
giving the basename of a file) with the name stored in ENTRY (a
|
||||
dirent **). */
|
||||
|
||||
static int
|
||||
DEFUN(compare_path, (key, entry),
|
||||
const void *key AND const void *entry)
|
||||
{
|
||||
return strcmp ((const char *) key,
|
||||
(*((const struct dirent **) entry))->d_name);
|
||||
}
|
||||
|
||||
/* Returns nonzero if ENTRY names a .java or .class file. */
|
||||
|
||||
static int
|
||||
DEFUN(java_or_class_file, (entry),
|
||||
const struct dirent *entry)
|
||||
{
|
||||
const char *base = basename (entry->d_name);
|
||||
return (fnmatch ("*.java", base, 0) == 0 ||
|
||||
fnmatch ("*.class", base, 0) == 0);
|
||||
}
|
||||
|
||||
/* Information about the files present in a particular directory. */
|
||||
typedef struct memoized_dirlist_entry
|
||||
{
|
||||
/* The name of the directory. */
|
||||
const char *dir;
|
||||
/* The number of .java and .class files present, or -1 if we could
|
||||
not, for some reason, obtain the list. */
|
||||
int num_files;
|
||||
/* The .java and .class files in the directory, in alphabetical
|
||||
order. */
|
||||
struct dirent **files;
|
||||
} memoized_dirlist_entry;
|
||||
|
||||
/* Returns true if ENTRY (a memoized_dirlist_entry *) correponds to
|
||||
the directory given by KEY (a char *) giving the directory
|
||||
name. */
|
||||
|
||||
static int
|
||||
DEFUN(memoized_dirlist_lookup_eq, (entry, key),
|
||||
const void *entry AND const void *key)
|
||||
{
|
||||
return strcmp ((const char *) key,
|
||||
((const memoized_dirlist_entry *) entry)->dir) == 0;
|
||||
}
|
||||
|
||||
/* A hash table mapping directory names to the lists of .java and
|
||||
.class files in that directory. */
|
||||
|
||||
static htab_t memoized_dirlists;
|
||||
|
||||
#endif
|
||||
|
||||
/* Like stat, but avoids actually making the stat system call if we
|
||||
know that it cannot succeed. FILENAME and BUF are as for stat. */
|
||||
|
||||
static int
|
||||
DEFUN(caching_stat, (filename, buf),
|
||||
char *filename AND struct stat *buf)
|
||||
{
|
||||
#if JCF_USE_SCANDIR
|
||||
char *sep;
|
||||
char *base;
|
||||
memoized_dirlist_entry *dent;
|
||||
void **slot;
|
||||
|
||||
/* If the hashtable has not already been created, create it now. */
|
||||
if (!memoized_dirlists)
|
||||
memoized_dirlists = htab_create (37,
|
||||
htab_hash_string,
|
||||
memoized_dirlist_lookup_eq,
|
||||
NULL);
|
||||
|
||||
/* Get the name of the directory. */
|
||||
sep = strrchr (filename, DIR_SEPARATOR);
|
||||
if (sep)
|
||||
{
|
||||
*sep = '\0';
|
||||
base = sep + 1;
|
||||
}
|
||||
else
|
||||
base = filename;
|
||||
|
||||
/* Obtain the entry for this directory form the hash table. */
|
||||
slot = htab_find_slot (memoized_dirlists, filename, INSERT);
|
||||
if (!*slot)
|
||||
{
|
||||
/* We have not already scanned this directory; scan it now. */
|
||||
dent = ((memoized_dirlist_entry *)
|
||||
ALLOC (sizeof (memoized_dirlist_entry)));
|
||||
dent->dir = xstrdup (filename);
|
||||
/* Unfortunately, scandir is not fully standardized. In
|
||||
particular, the type of the function pointer passed as the
|
||||
third argument sometimes takes a "const struct dirent *"
|
||||
parameter, and sometimes just a "struct dirent *". We rely
|
||||
on the ability to interchange these two types of function
|
||||
pointers. */
|
||||
dent->num_files = scandir (filename, &dent->files,
|
||||
java_or_class_file,
|
||||
alphasort);
|
||||
*slot = dent;
|
||||
}
|
||||
else
|
||||
dent = *((memoized_dirlist_entry **) slot);
|
||||
|
||||
/* Put the spearator back. */
|
||||
if (sep)
|
||||
*sep = DIR_SEPARATOR;
|
||||
|
||||
/* If the file is not in the list, there is no need to stat it; it
|
||||
does not exist. */
|
||||
if (dent->num_files != -1
|
||||
&& !bsearch (base, dent->files, dent->num_files,
|
||||
sizeof (struct dirent *), compare_path))
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
return stat (filename, buf);
|
||||
}
|
||||
|
||||
/* Returns 1 if the CLASSNAME (really a char *) matches the name
|
||||
stored in TABLE_ENTRY (also a char *). */
|
||||
|
||||
static int
|
||||
DEFUN(memoized_class_lookup_eq, (table_entry, classname),
|
||||
const void *table_entry AND const void *classname)
|
||||
{
|
||||
return strcmp ((const char *)classname, (const char *)table_entry) == 0;
|
||||
}
|
||||
|
||||
/* A hash table keeping track of class names that were not found
|
||||
during class lookup. (There is no need to cache the values
|
||||
associated with names that were found; they are saved in
|
||||
IDENTIFIER_CLASS_VALUE.) */
|
||||
static htab_t memoized_class_lookups;
|
||||
|
||||
/* Returns a freshly malloc'd string with the fully qualified pathname
|
||||
of the .class file for the class CLASSNAME. Returns NULL on
|
||||
failure. If JCF != NULL, it is suitably initialized.
|
||||
SOURCE_OK is true if we should also look for .java file. */
|
||||
of the .class file for the class CLASSNAME. CLASSNAME must be
|
||||
allocated in permanent storage; this function may retain a pointer
|
||||
to it. Returns NULL on failure. If JCF != NULL, it is suitably
|
||||
initialized. SOURCE_OK is true if we should also look for .java
|
||||
file. */
|
||||
|
||||
const char *
|
||||
DEFUN(find_class, (classname, classname_length, jcf, source_ok),
|
||||
@ -324,11 +471,27 @@ DEFUN(find_class, (classname, classname_length, jcf, source_ok),
|
||||
char *dep_file;
|
||||
void *entry;
|
||||
char *java_buffer;
|
||||
int buflen;
|
||||
char *buffer;
|
||||
hashval_t hash;
|
||||
|
||||
/* Create the hash table, if it does not already exist. */
|
||||
if (!memoized_class_lookups)
|
||||
memoized_class_lookups = htab_create (37,
|
||||
htab_hash_string,
|
||||
memoized_class_lookup_eq,
|
||||
NULL);
|
||||
|
||||
/* Loop for this class in the hashtable. If it is present, we've
|
||||
already looked for this class and failed to find it. */
|
||||
hash = htab_hash_string (classname);
|
||||
if (htab_find_with_hash (memoized_class_lookups, classname, hash))
|
||||
return NULL;
|
||||
|
||||
/* Allocate and zero out the buffer, since we don't explicitly put a
|
||||
null pointer when we're copying it below. */
|
||||
int buflen = jcf_path_max_len () + classname_length + 10;
|
||||
char *buffer = (char *) ALLOC (buflen);
|
||||
buflen = jcf_path_max_len () + classname_length + 10;
|
||||
buffer = (char *) ALLOC (buflen);
|
||||
memset (buffer, 0, buflen);
|
||||
|
||||
java_buffer = (char *) alloca (buflen);
|
||||
@ -381,7 +544,7 @@ DEFUN(find_class, (classname, classname_length, jcf, source_ok),
|
||||
else
|
||||
continue;
|
||||
}
|
||||
class = stat (buffer, &class_buf);
|
||||
class = caching_stat(buffer, &class_buf);
|
||||
}
|
||||
|
||||
if (source_ok)
|
||||
@ -393,7 +556,7 @@ DEFUN(find_class, (classname, classname_length, jcf, source_ok),
|
||||
for (m = 0; m < classname_length; ++m)
|
||||
java_buffer[m + l] = (classname[m] == '.' ? '/' : classname[m]);
|
||||
strcpy (java_buffer + m + l, ".java");
|
||||
java = stat (java_buffer, &java_buf);
|
||||
java = caching_stat (java_buffer, &java_buf);
|
||||
if (java == 0)
|
||||
break;
|
||||
}
|
||||
@ -464,6 +627,12 @@ DEFUN(find_class, (classname, classname_length, jcf, source_ok),
|
||||
#endif
|
||||
|
||||
free (buffer);
|
||||
|
||||
/* Remember that this class could not be found so that we do not
|
||||
have to look again. */
|
||||
*htab_find_slot_with_hash (memoized_class_lookups, classname, hash, INSERT)
|
||||
= (void *) classname;
|
||||
|
||||
return NULL;
|
||||
found:
|
||||
#if JCF_USE_STDIO
|
||||
|
@ -63,6 +63,14 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
|
||||
#define JCF_word JCF_u4
|
||||
#endif
|
||||
|
||||
/* If we have both "scandir" and "alphasort", we can cache directory
|
||||
listings to reduce the time taken to search the classpath. */
|
||||
#if defined(HAVE_SCANDIR) && defined(HAVE_ALPHASORT)
|
||||
#define JCF_USE_SCANDIR 1
|
||||
#else
|
||||
#define JCF_USE_SCANDIR 0
|
||||
#endif
|
||||
|
||||
struct JCF;
|
||||
typedef int (*jcf_filbuf_t) PARAMS ((struct JCF*, int needed));
|
||||
|
||||
|
@ -9048,10 +9048,30 @@ java_expand_classes ()
|
||||
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
|
||||
{
|
||||
tree current;
|
||||
tree reversed_class_list = NULL;
|
||||
|
||||
ctxp = cur_ctxp;
|
||||
for (current = ctxp->class_list; current; current = TREE_CHAIN (current))
|
||||
|
||||
/* We write out the classes in reverse order. This ensures that
|
||||
inner classes are written before their containing classes,
|
||||
which is important for parallel builds. Otherwise, the
|
||||
class file for the outer class may be found, but the class
|
||||
file for the inner class may not be present. In that
|
||||
situation, the compiler cannot fall back to the original
|
||||
source, having already read the outer class, so we must
|
||||
prevent that situation. */
|
||||
for (current = ctxp->class_list;
|
||||
current;
|
||||
current = TREE_CHAIN (current))
|
||||
reversed_class_list
|
||||
= tree_cons (NULL_TREE, current, reversed_class_list);
|
||||
ggc_add_tree_root (&reversed_class_list, 1);
|
||||
|
||||
for (current = reversed_class_list;
|
||||
current;
|
||||
current = TREE_CHAIN (current))
|
||||
{
|
||||
current_class = TREE_TYPE (current);
|
||||
current_class = TREE_TYPE (TREE_VALUE (current));
|
||||
outgoing_cpool = TYPE_CPOOL (current_class);
|
||||
if (flag_emit_class_files)
|
||||
write_classfile (current_class);
|
||||
@ -9063,6 +9083,8 @@ java_expand_classes ()
|
||||
finish_class ();
|
||||
}
|
||||
}
|
||||
|
||||
ggc_del_root (&reversed_class_list);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user