Compare commits

...

1 Commits

Author SHA1 Message Date
Shilei Tian
ec0e2e6394 [Module] Use SmallVector to store target triples and data layouts 2021-08-17 15:30:10 -04:00
5 changed files with 86 additions and 18 deletions

View File

@@ -845,6 +845,9 @@ endif()
# compatibility. # compatibility.
set(LLVM_ENABLE_NEW_PASS_MANAGER ${ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER}) set(LLVM_ENABLE_NEW_PASS_MANAGER ${ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER})
# By default a heterogenous module can support 32 targets
set(LLVM_MODULE_NUM_TARGETS 32)
# Configure the three LLVM configuration header files. # Configure the three LLVM configuration header files.
configure_file( configure_file(
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake

View File

@@ -103,5 +103,7 @@
/* Whether Timers signpost passes in Xcode Instruments */ /* Whether Timers signpost passes in Xcode Instruments */
#cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS #cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS
/* Define the number of targets that a heterogenous module can support */
#cmakedefine LLVM_MODULE_NUM_TARGETS ${LLVM_MODULE_NUM_TARGETS}
#endif #endif

View File

@@ -182,7 +182,8 @@ private:
AliasListType AliasList; ///< The Aliases in the module AliasListType AliasList; ///< The Aliases in the module
IFuncListType IFuncList; ///< The IFuncs in the module IFuncListType IFuncList; ///< The IFuncs in the module
NamedMDListType NamedMDList; ///< The named metadata in the module NamedMDListType NamedMDList; ///< The named metadata in the module
std::string GlobalScopeAsm; ///< Inline Asm at global scope. SmallVector<std::string, LLVM_MODULE_NUM_TARGETS>
GlobalScopeAsms; ///< Inline Asm at global scope.
std::unique_ptr<ValueSymbolTable> ValSymTab; ///< Symbol table for values std::unique_ptr<ValueSymbolTable> ValSymTab; ///< Symbol table for values
ComdatSymTabType ComdatSymTab; ///< Symbol table for COMDATs ComdatSymTabType ComdatSymTab; ///< Symbol table for COMDATs
std::unique_ptr<MemoryBuffer> std::unique_ptr<MemoryBuffer>
@@ -193,10 +194,12 @@ private:
std::string ModuleID; ///< Human readable identifier for the module std::string ModuleID; ///< Human readable identifier for the module
std::string SourceFileName; ///< Original source file name for module, std::string SourceFileName; ///< Original source file name for module,
///< recorded in bitcode. ///< recorded in bitcode.
std::string TargetTriple; ///< Platform target triple Module compiled on SmallVector<std::string, LLVM_MODULE_NUM_TARGETS>
TargetTriples; ///< Platform target triple Module compiled on
///< Format: (arch)(sub)-(vendor)-(sys0-(abi) ///< Format: (arch)(sub)-(vendor)-(sys0-(abi)
NamedMDSymTabType NamedMDSymTab; ///< NamedMDNode names. NamedMDSymTabType NamedMDSymTab; ///< NamedMDNode names.
DataLayout DL; ///< DataLayout associated with the module SmallVector<DataLayout, LLVM_MODULE_NUM_TARGETS>
DLs; ///< DataLayout associated with the module
StringMap<unsigned> StringMap<unsigned>
CurrentIntrinsicIds; ///< Keep track of the current unique id count for CurrentIntrinsicIds; ///< Keep track of the current unique id count for
///< the specified intrinsic basename. ///< the specified intrinsic basename.
@@ -205,6 +208,9 @@ private:
///< based on unnamed types. The combination of ///< based on unnamed types. The combination of
///< ID and FunctionType maps to the extension that ///< ID and FunctionType maps to the extension that
///< is used to make the intrinsic name unique. ///< is used to make the intrinsic name unique.
bool HeterogenousIRModule; ///< If the module is heterogenous IR module.
unsigned NumTargets; ///< Number of targets in the module if the module
///< is heterogenous IR module.
friend class Constant; friend class Constant;
@@ -245,16 +251,23 @@ public:
/// Get the data layout string for the module's target platform. This is /// Get the data layout string for the module's target platform. This is
/// equivalent to getDataLayout()->getStringRepresentation(). /// equivalent to getDataLayout()->getStringRepresentation().
const std::string &getDataLayoutStr() const { const std::string &getDataLayoutStr() const { return getDataLayoutStr(0); }
return DL.getStringRepresentation(); const std::string &getDataLayoutStr(unsigned TargetId) const {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
return DLs[TargetId].getStringRepresentation();
} }
/// Get the data layout for the module's target platform. /// Get the data layout for the module's target platform.
const DataLayout &getDataLayout() const; const DataLayout &getDataLayout() const { return getDataLayout(0); }
const DataLayout &getDataLayout(unsigned TargetId) const;
/// Get the target triple which is a string describing the target host. /// Get the target triple which is a string describing the target host.
/// @returns a string containing the target triple. /// @returns a string containing the target triple.
const std::string &getTargetTriple() const { return TargetTriple; } const std::string &getTargetTriple() const { return getTargetTriple(0); }
const std::string &getTargetTriple(unsigned TargetId) const {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
return TargetTriples[TargetId];
}
/// Get the global data context. /// Get the global data context.
/// @returns LLVMContext - a container for LLVM's global information /// @returns LLVMContext - a container for LLVM's global information
@@ -262,7 +275,13 @@ public:
/// Get any module-scope inline assembly blocks. /// Get any module-scope inline assembly blocks.
/// @returns a string containing the module-scope inline assembly blocks. /// @returns a string containing the module-scope inline assembly blocks.
const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; } const std::string &getModuleInlineAsm() const {
return getModuleInlineAsm(0);
}
const std::string &getModuleInlineAsm(unsigned TargetId) const {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
return GlobalScopeAsms[TargetId];
}
/// Get a RandomNumberGenerator salted for use with this module. The /// Get a RandomNumberGenerator salted for use with this module. The
/// RNG can be seeded via -rng-seed=<uint64> and is salted with the /// RNG can be seeded via -rng-seed=<uint64> and is salted with the
@@ -293,15 +312,30 @@ public:
void setSourceFileName(StringRef Name) { SourceFileName = std::string(Name); } void setSourceFileName(StringRef Name) { SourceFileName = std::string(Name); }
/// Set the data layout /// Set the data layout
void setDataLayout(StringRef Desc); void setDataLayout(StringRef Desc) {
void setDataLayout(const DataLayout &Other); setDataLayout(0, Desc);
}
void setDataLayout(const DataLayout &Other) {
setDataLayout(0, Other);
}
void setDataLayout(unsigned TargetId, StringRef Desc);
void setDataLayout(unsigned TargetId, const DataLayout &Other);
/// Set the target triple. /// Set the target triple.
void setTargetTriple(StringRef T) { TargetTriple = std::string(T); } void setTargetTriple(StringRef T) { setTargetTriple(0, T); }
void setTargetTriple(unsigned TargetId, StringRef T) {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
TargetTriples[TargetId] = std::string(T);
}
/// Set the module-scope inline assembly blocks. /// Set the module-scope inline assembly blocks.
/// A trailing newline is added if the input doesn't have one. /// A trailing newline is added if the input doesn't have one.
void setModuleInlineAsm(StringRef Asm) { void setModuleInlineAsm(StringRef Asm) {
setModuleInlineAsm(0, Asm);
}
void setModuleInlineAsm(unsigned TargetId, StringRef Asm) {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
std::string &GlobalScopeAsm = GlobalScopeAsms[TargetId];
GlobalScopeAsm = std::string(Asm); GlobalScopeAsm = std::string(Asm);
if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n')
GlobalScopeAsm += '\n'; GlobalScopeAsm += '\n';
@@ -309,12 +343,24 @@ public:
/// Append to the module-scope inline assembly blocks. /// Append to the module-scope inline assembly blocks.
/// A trailing newline is added if the input doesn't have one. /// A trailing newline is added if the input doesn't have one.
void appendModuleInlineAsm(StringRef Asm) { void appendModuleInlineAsm(StringRef Asm) { appendModuleInlineAsm(0, Asm); }
void appendModuleInlineAsm(unsigned TargetId, StringRef Asm) {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
std::string &GlobalScopeAsm = GlobalScopeAsms[TargetId];
GlobalScopeAsm += Asm; GlobalScopeAsm += Asm;
if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n')
GlobalScopeAsm += '\n'; GlobalScopeAsm += '\n';
} }
/// Set the indicator if the module is heterogenous IR module.
void setHeterogenousIRModule(bool Value) { HeterogenousIRModule = Value; }
/// Return true if the module is heterogenous IR module.
bool isHeterogenousIRModule() const { return HeterogenousIRModule; }
/// Return the number of targets stored in the module.
unsigned getNumTargets() const { return NumTargets; }
/// @} /// @}
/// @name Generic Value Accessors /// @name Generic Value Accessors
/// @{ /// @{

View File

@@ -74,7 +74,10 @@ template class llvm::SymbolTableListTraits<GlobalIFunc>;
Module::Module(StringRef MID, LLVMContext &C) Module::Module(StringRef MID, LLVMContext &C)
: Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)), : Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
Materializer(), ModuleID(std::string(MID)), Materializer(), ModuleID(std::string(MID)),
SourceFileName(std::string(MID)), DL("") { SourceFileName(std::string(MID)) {
GlobalScopeAsms.resize(LLVM_MODULE_NUM_TARGETS, "");
TargetTriples.resize(LLVM_MODULE_NUM_TARGETS, "");
DLs.resize(LLVM_MODULE_NUM_TARGETS, DataLayout(""));
Context.addModule(this); Context.addModule(this);
} }
@@ -151,7 +154,7 @@ FunctionCallee Module::getOrInsertFunction(StringRef Name, FunctionType *Ty,
if (!F) { if (!F) {
// Nope, add it // Nope, add it
Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage, Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage,
DL.getProgramAddressSpace(), Name); DLs[0].getProgramAddressSpace(), Name);
if (!New->isIntrinsic()) // Intrinsics get attrs set on construction if (!New->isIntrinsic()) // Intrinsics get attrs set on construction
New->setAttributes(AttributeList); New->setAttributes(AttributeList);
FunctionList.push_back(New); FunctionList.push_back(New);
@@ -392,13 +395,20 @@ void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
addModuleFlag(Behavior, Key, Val); addModuleFlag(Behavior, Key, Val);
} }
void Module::setDataLayout(StringRef Desc) { void Module::setDataLayout(unsigned TargetId, StringRef Desc) {
DL.reset(Desc); assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
DLs[TargetId].reset(Desc);
} }
void Module::setDataLayout(const DataLayout &Other) { DL = Other; } void Module::setDataLayout(unsigned TargetId, const DataLayout &Other) {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
DLs[TargetId] = Other;
}
const DataLayout &Module::getDataLayout() const { return DL; } const DataLayout &Module::getDataLayout(unsigned TargetId) const {
assert(TargetId < LLVM_MODULE_NUM_TARGETS && "TargetId is out of range");
return DLs[TargetId];
}
DICompileUnit *Module::debug_compile_units_iterator::operator*() const { DICompileUnit *Module::debug_compile_units_iterator::operator*() const {
return cast<DICompileUnit>(CUs->getOperand(Idx)); return cast<DICompileUnit>(CUs->getOperand(Idx));

View File

@@ -124,6 +124,11 @@ static cl::opt<bool> NoVerify("disable-verify",
cl::desc("Do not run the verifier"), cl::Hidden, cl::desc("Do not run the verifier"), cl::Hidden,
cl::cat(LinkCategory)); cl::cat(LinkCategory));
static cl::opt<bool>
HeterogenousIRModule("heterogenous-ir-module",
cl::desc("Enable heterogenous IR module"), cl::Hidden,
cl::cat(LinkCategory));
static ExitOnError ExitOnErr; static ExitOnError ExitOnErr;
// Read the specified bitcode file in and return it. This routine searches the // Read the specified bitcode file in and return it. This routine searches the
@@ -454,6 +459,8 @@ int main(int argc, char **argv) {
Context.enableDebugTypeODRUniquing(); Context.enableDebugTypeODRUniquing();
auto Composite = std::make_unique<Module>("llvm-link", Context); auto Composite = std::make_unique<Module>("llvm-link", Context);
if (HeterogenousIRModule)
Composite->setHeterogenousIRModule(true);
Linker L(*Composite); Linker L(*Composite);
unsigned Flags = Linker::Flags::None; unsigned Flags = Linker::Flags::None;