// fileread.h -- read files for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
int nanoseconds;
};
+// Get the last modified time of an unopened file. Returns false if the
+// file does not exist.
+
+bool
+get_mtime(const char* filename, Timespec* mtime);
+
class Position_dependent_options;
class Input_file_argument;
class Dirsearch;
// SIZE bytes. OFFSET is the offset into the input file for the
// file we are reading; this is zero for a normal object file,
// non-zero for an object file in an archive. ALIGNED is true if
- // the data must be naturally aligned; this only matters when OFFSET
- // is not zero. The pointer will remain valid until the File_read
- // is unlocked. It is an error if we can not read enough data from
- // the file. The CACHE parameter is a hint as to whether it will be
- // useful to cache this data for later accesses--i.e., later calls
- // to get_view, read, or get_lasting_view which retrieve the same
+ // the data must be naturally aligned (i.e., aligned to the size
+ // of a target word); this only matters when OFFSET is not zero.
+ // The pointer will remain valid until the File_read is unlocked.
+ // It is an error if we can not read enough data from the file.
+ // The CACHE parameter is a hint as to whether it will be useful
+ // to cache this data for later accesses--i.e., later calls to
+ // get_view, read, or get_lasting_view which retrieve the same
// data.
const unsigned char*
get_view(off_t offset, off_t start, section_size_type size, bool aligned,
// interface, and it would be nice to have something more automatic.
void
clear_uncached_views()
- { this->clear_views(false); }
+ { this->clear_views(CLEAR_VIEWS_ARCHIVE); }
// A struct used to do a multiple read.
struct Read_multiple_entry
get_mtime();
private:
+ // Control for what views to clear.
+ enum Clear_views_mode
+ {
+ // Clear uncached views not used by an archive.
+ CLEAR_VIEWS_NORMAL,
+ // Clear all uncached views (including in an archive).
+ CLEAR_VIEWS_ARCHIVE,
+ // Clear all views (i.e., we're destroying the file).
+ CLEAR_VIEWS_ALL
+ };
+
// This class may not be copied.
File_read(const File_read&);
File_read& operator=(const File_read&);
- // Total bytes mapped into memory during the link. This variable
- // may not be accurate when running multi-threaded.
+ // Total bytes mapped into memory during the link if --stats.
static unsigned long long total_mapped_bytes;
- // Current number of bytes mapped into memory during the link. This
- // variable may not be accurate when running multi-threaded.
+ // Current number of bytes mapped into memory during the link if
+ // --stats.
static unsigned long long current_mapped_bytes;
- // High water mark of bytes mapped into memory during the link.
- // This variable may not be accurate when running multi-threaded.
+ // High water mark of bytes mapped into memory during the link if
+ // --stats.
static unsigned long long maximum_mapped_bytes;
// A view into the file.
{
// Data owned by File object - nothing done in destructor.
DATA_NOT_OWNED,
- // Data alocated with new[] and owned by this object - should
+ // Data allocated with new[] and owned by this object - should
// use delete[].
DATA_ALLOCATED_ARRAY,
// Data mmapped and owned by this object - should munmap.
accessed() const
{ return this->accessed_; }
+ // Returns TRUE if this view contains permanent data -- e.g., data that
+ // was supplied by the owner of the File object.
+ bool
+ is_permanent_view() const
+ { return this->data_ownership_ == DATA_NOT_OWNED; }
+
private:
View(const View&);
View& operator=(const View&);
// Clear the file views.
void
- clear_views(bool);
+ clear_views(Clear_views_mode);
// The size of a file page for buffering data.
static const off_t page_size = 8192;
{ return (file_size + (page_size - 1)) & ~ (page_size - 1); }
// The maximum number of entries we will pass to ::readv.
-#ifdef HAVE_READV
static const size_t max_readv_entries = 128;
-#else
- // On targets that don't have readv set the max to 1 so readv is not
- // used.
- static const size_t max_readv_entries = 1;
-#endif
// Use readv to read data.
void
class Input_file
{
public:
+ enum Format
+ {
+ FORMAT_NONE,
+ FORMAT_ELF,
+ FORMAT_BINARY
+ };
+
Input_file(const Input_file_argument* input_argument)
: input_argument_(input_argument), found_name_(), file_(),
- is_in_sysroot_(false)
+ is_in_sysroot_(false), format_(FORMAT_NONE)
{ }
+ // Create an input file given just a filename.
+ Input_file(const char* name);
+
// Create an input file with the contents already provided. This is
// only used for testing. With this path, don't call the open
// method.
// restarted to find the next file with a matching name by
// incrementing the result and calling this again.
bool
- open(const Dirsearch&, const Task*, int *pindex);
+ open(const Dirsearch&, const Task*, int* pindex);
// Return the name given by the user. For -lc this will return "c".
const char*
bool
just_symbols() const;
+ // Return the format of the unconverted input file.
+ Format
+ format() const
+ { return this->format_; }
+
+ // Try to find a file in the extra search dirs. Returns true on success.
+ static bool
+ try_extra_search_path(int* pindex,
+ const Input_file_argument* input_argument,
+ std::string filename, std::string* found_name,
+ std::string* namep);
+
+ // Find the actual file.
+ static bool
+ find_file(const Dirsearch& dirpath, int* pindex,
+ const Input_file_argument* input_argument,
+ bool* is_in_sysroot,
+ std::string* found_name, std::string* namep);
+
private:
Input_file(const Input_file&);
Input_file& operator=(const Input_file&);
File_read file_;
// Whether we found the file in a directory in the system root.
bool is_in_sysroot_;
+ // Format of unconverted input file.
+ Format format_;
};
} // end namespace gold