Kill ModuleProvider and ghost linkage by inverting the relationship between

Modules and ModuleProviders. Because the "ModuleProvider" simply materializes
GlobalValues now, and doesn't provide modules, it's renamed to
"GVMaterializer". Code that used to need a ModuleProvider to materialize
Functions can now materialize the Functions directly. Functions no longer use a
magic linkage to record that they're materializable; they simply ask the
GVMaterializer.

Because the C ABI must never change, we can't remove LLVMModuleProviderRef or
the functions that refer to it. Instead, because Module now exposes the same
functionality ModuleProvider used to, we store a Module* in any
LLVMModuleProviderRef and translate in the wrapper methods.  The bindings to
other languages still use the ModuleProvider concept.  It would probably be
worth some time to update them to follow the C++ more closely, but I don't
intend to do it.

Fixes http://llvm.org/PR5737 and http://llvm.org/PR5735.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94686 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jeffrey Yasskin
2010-01-27 20:34:15 +00:00
parent 5deb57c685
commit f0356fe140
62 changed files with 624 additions and 720 deletions

View File

@@ -19,12 +19,14 @@
#include "llvm/GlobalVariable.h"
#include "llvm/GlobalAlias.h"
#include "llvm/Metadata.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/System/DataTypes.h"
#include <vector>
namespace llvm {
class FunctionType;
class GVMaterializer;
class LLVMContext;
class MDSymbolTable;
@@ -145,6 +147,7 @@ private:
std::string GlobalScopeAsm; ///< Inline Asm at global scope.
ValueSymbolTable *ValSymTab; ///< Symbol table for values
TypeSymbolTable *TypeSymTab; ///< Symbol table for types
OwningPtr<GVMaterializer> Materializer; ///< Used to materialize GlobalValues
std::string ModuleID; ///< Human readable identifier for the module
std::string TargetTriple; ///< Platform target triple Module compiled on
std::string DataLayout; ///< Target data description
@@ -346,6 +349,50 @@ public:
/// null if there is none by that name.
const Type *getTypeByName(StringRef Name) const;
/// @}
/// @name Materialization
/// @{
/// setMaterializer - Sets the GVMaterializer to GVM. This module must not
/// yet have a Materializer. To reset the materializer for a module that
/// already has one, call MaterializeAllPermanently first. Destroying this
/// module will destroy its materializer without materializing any more
/// GlobalValues. Without destroying the Module, there is no way to detach or
/// destroy a materializer without materializing all the GVs it controls, to
/// avoid leaving orphan unmaterialized GVs.
void setMaterializer(GVMaterializer *GVM);
/// getMaterializer - Retrieves the GVMaterializer, if any, for this Module.
GVMaterializer *getMaterializer() const { return Materializer.get(); }
/// isMaterializable - True if the definition of GV has yet to be materialized
/// from the GVMaterializer.
bool isMaterializable(const GlobalValue *GV) const;
/// isDematerializable - Returns true if this GV was loaded from this Module's
/// GVMaterializer and the GVMaterializer knows how to dematerialize the GV.
bool isDematerializable(const GlobalValue *GV) const;
/// Materialize - Make sure the GlobalValue is fully read. If the module is
/// corrupt, this returns true and fills in the optional string with
/// information about the problem. If successful, this returns false.
bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0);
/// Dematerialize - If the GlobalValue is read in, and if the GVMaterializer
/// supports it, release the memory for the function, and set it up to be
/// materialized lazily. If !isDematerializable(), this method is a noop.
void Dematerialize(GlobalValue *GV);
/// MaterializeAll - Make sure all GlobalValues in this Module are fully read.
/// If the module is corrupt, this returns true and fills in the optional
/// string with information about the problem. If successful, this returns
/// false.
bool MaterializeAll(std::string *ErrInfo = 0);
/// MaterializeAllPermanently - Make sure all GlobalValues in this Module are
/// fully read and clear the Materializer. If the module is corrupt, this
/// returns true, fills in the optional string with information about the
/// problem, and DOES NOT clear the old Materializer. If successful, this
/// returns false.
bool MaterializeAllPermanently(std::string *ErrInfo = 0);
/// @}
/// @name Direct access to the globals list, functions list, and symbol table
/// @{