Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Unified Diff: src/PNaClTranslator.cpp

Issue 641193002: Introduce the notion of function addresses in Subzero. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nit in test. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceTranslator.cpp ('k') | tests_lit/llvm2ice_tests/globalrelocs.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/PNaClTranslator.cpp
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index 6642ba977bbc57b588503bfb6416e5bd02f14db8..4f7a745626bcad64bf6ee3cbaf5e7170d6c837f9 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -24,7 +24,6 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Support/ValueHandle.h"
#include "IceCfg.h"
#include "IceCfgNode.h"
@@ -36,9 +35,8 @@
#include "IceTypeConverter.h"
#include "PNaClTranslator.h"
-using namespace llvm;
-
namespace {
+using namespace llvm;
// TODO(kschimpf) Remove error recovery once implementation complete.
static cl::opt<bool> AllowErrorRecovery(
@@ -160,19 +158,21 @@ class TopLevelParser : public NaClBitcodeParser {
TopLevelParser &operator=(const TopLevelParser &) = delete;
public:
+ typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType;
+
TopLevelParser(Ice::Translator &Translator, const std::string &InputName,
NaClBitcodeHeader &Header, NaClBitstreamCursor &Cursor,
bool &ErrorStatus)
: NaClBitcodeParser(Cursor), Translator(Translator),
Mod(new Module(InputName, getGlobalContext())), DL(PNaClDataLayout),
- Header(Header), TypeConverter(getLLVMContext()),
+ Header(Header), TypeConverter(Mod->getContext()),
ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
NumFunctionBlocks(0) {
Mod->setDataLayout(PNaClDataLayout);
setErrStream(Translator.getContext()->getStrDump());
}
- ~TopLevelParser() override { DeleteContainerPointers(GlobalIDAddresses); }
+ ~TopLevelParser() override {}
Ice::Translator &getTranslator() { return Translator; }
@@ -198,9 +198,6 @@ public:
/// Returns the number of bytes in the bitcode header.
size_t getHeaderSize() const { return Header.getHeaderSize(); }
- /// Returns the llvm context to use.
- LLVMContext &getLLVMContext() const { return Mod->getContext(); }
-
/// Changes the size of the type list to the given size.
void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); }
@@ -236,36 +233,40 @@ public:
}
/// Sets the next function ID to the given LLVM function.
- void setNextFunctionID(Function *Fcn) {
+ void setNextFunctionID(Ice::FunctionDeclaration *Fcn) {
++NumFunctionIds;
- FunctionIDValues.push_back(Fcn);
+ FunctionDeclarationList.push_back(Fcn);
}
/// Defines the next function ID as one that has an implementation
/// (i.e a corresponding function block in the bitcode).
void setNextValueIDAsImplementedFunction() {
- DefiningFunctionsList.push_back(FunctionIDValues.size());
+ DefiningFunctionDeclarationsList.push_back(FunctionDeclarationList.size());
}
/// Returns the value id that should be associated with the the
/// current function block. Increments internal counters during call
/// so that it will be in correct position for next function block.
unsigned getNextFunctionBlockValueID() {
- if (NumFunctionBlocks >= DefiningFunctionsList.size())
+ if (NumFunctionBlocks >= DefiningFunctionDeclarationsList.size())
report_fatal_error(
"More function blocks than defined function addresses");
- return DefiningFunctionsList[NumFunctionBlocks++];
+ return DefiningFunctionDeclarationsList[NumFunctionBlocks++];
}
- /// Returns the LLVM Function address associated with ID.
- Function *getFunctionByID(unsigned ID) const {
- if (ID >= FunctionIDValues.size())
- return nullptr;
- Value *V = FunctionIDValues[ID];
- return cast<Function>(V);
+ /// Returns the function associated with ID.
+ Ice::FunctionDeclaration *getFunctionByID(unsigned ID) {
+ if (ID < FunctionDeclarationList.size())
+ return FunctionDeclarationList[ID];
+ return reportGetFunctionByIDError(ID);
}
- /// Returns the corresponding constant associated with a global value
+ /// Returns the list of function declarations.
+ const FunctionDeclarationListType &getFunctionDeclarationList() const {
+ return FunctionDeclarationList;
+ }
+
+ /// Returns the corresponding constant associated with a global declaration.
/// (i.e. relocatable).
Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) {
// TODO(kschimpf): Can this be built when creating global initializers?
@@ -273,7 +274,7 @@ public:
if (ID >= ValueIDConstants.size()) {
C = nullptr;
unsigned ExpectedSize =
- FunctionIDValues.size() + GlobalIDAddresses.size();
+ FunctionDeclarationList.size() + VariableDeclarations.size();
if (ID >= ExpectedSize)
ExpectedSize = ID;
ValueIDConstants.resize(ExpectedSize);
@@ -284,12 +285,13 @@ public:
return C;
// If reached, no such constant exists, create one.
+ // TODO(kschimpf) Don't get addresses of intrinsic function declarations.
std::string Name;
- unsigned FcnIDSize = FunctionIDValues.size();
+ unsigned FcnIDSize = FunctionDeclarationList.size();
if (ID < FcnIDSize) {
- Name = FunctionIDValues[ID]->getName();
- } else if ((ID - FcnIDSize) < GlobalIDAddresses.size()) {
- Name = GlobalIDAddresses[ID - FcnIDSize]->getName();
+ Name = FunctionDeclarationList[ID]->getName();
+ } else if ((ID - FcnIDSize) < VariableDeclarations.size()) {
+ Name = VariableDeclarations[ID - FcnIDSize]->getName();
} else {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
@@ -304,47 +306,49 @@ public:
return C;
}
- /// Returns the number of function addresses (i.e. ID's) defined in
- /// the bitcode file.
+ /// Returns the number of function declarations in the bitcode file.
unsigned getNumFunctionIDs() const { return NumFunctionIds; }
- /// Returns the number of global IDs (function and global addresses)
- /// defined in the bitcode file.
+ /// Returns the number of global declarations (i.e. IDs) defined in
+ /// the bitcode file.
unsigned getNumGlobalIDs() const {
- return FunctionIDValues.size() + GlobalIDAddresses.size();
+ return FunctionDeclarationList.size() + VariableDeclarations.size();
}
- /// Creates Count global addresses.
- void CreateGlobalAddresses(size_t Count) {
- assert(GlobalIDAddresses.empty());
+ /// Creates Count global variable declarations.
+ void CreateGlobalVariables(size_t Count) {
+ assert(VariableDeclarations.empty());
+ Ice::GlobalContext *Context = getTranslator().getContext();
for (size_t i = 0; i < Count; ++i) {
- GlobalIDAddresses.push_back(new Ice::GlobalAddress());
+ VariableDeclarations.push_back(Ice::VariableDeclaration::create(Context));
}
}
- /// Returns the number of global addresses (i.e. ID's) defined in
- /// the bitcode file.
- Ice::SizeT getNumGlobalAddresses() const { return GlobalIDAddresses.size(); }
+ /// Returns the number of global variable declarations in the
+ /// bitcode file.
+ Ice::SizeT getNumGlobalVariables() const {
+ return VariableDeclarations.size();
+ }
- /// Returns the global address with the given index.
- Ice::GlobalAddress *getGlobalAddress(size_t Index) {
- if (Index < GlobalIDAddresses.size())
- return GlobalIDAddresses[Index];
- std::string Buffer;
- raw_string_ostream StrBuf(Buffer);
- StrBuf << "Global index " << Index
- << " not allowed. Out of range. Must be less than "
- << GlobalIDAddresses.size();
- Error(StrBuf.str());
- // TODO(kschimpf) Remove error recovery once implementation complete.
- if (!GlobalIDAddresses.empty())
- return GlobalIDAddresses[0];
- report_fatal_error("Unable to continue");
+ /// Returns the global variable declaration with the given index.
+ Ice::VariableDeclaration *getGlobalVariableByID(unsigned Index) {
+ if (Index < VariableDeclarations.size())
+ return VariableDeclarations[Index];
+ return reportGetGlobalVariableByIDError(Index);
+ }
+
+ /// Returns the global declaration (variable or function) with the
+ /// given Index.
+ Ice::GlobalDeclaration *getGlobalDeclarationByID(size_t Index) {
+ if (Index < NumFunctionIds)
+ return getFunctionByID(Index);
+ else
+ return getGlobalVariableByID(Index - NumFunctionIds);
}
- /// Returns the list of read global addresses.
- const Ice::Translator::GlobalAddressList &getGlobalIDAddresses() {
- return GlobalIDAddresses;
+ /// Returns the list of parsed global variable declarations.
+ const Ice::Translator::VariableDeclarationListType &getGlobalVariables() {
+ return VariableDeclarations;
}
/// Returns the corresponding ICE type for LLVMTy.
@@ -383,20 +387,21 @@ private:
unsigned NumErrors;
// The types associated with each type ID.
std::vector<ExtendedType> TypeIDValues;
- // The set of function value IDs.
- std::vector<WeakVH> FunctionIDValues;
- // The set of global addresses IDs.
- Ice::Translator::GlobalAddressList GlobalIDAddresses;
- // Relocatable constants associated with FunctionIDValues and
- // GlobalIDAddresses.
+ // The set of functions.
+ FunctionDeclarationListType FunctionDeclarationList;
+ // The set of global variables.
+ Ice::Translator::VariableDeclarationListType VariableDeclarations;
+ // Relocatable constants associated with global declarations.
std::vector<Ice::Constant *> ValueIDConstants;
- // The number of function IDs.
+ // The number of function declarations (i.e. IDs).
unsigned NumFunctionIds;
// The number of function blocks (processed so far).
unsigned NumFunctionBlocks;
- // The list of value IDs (in the order found) of defining function
- // addresses.
- std::vector<unsigned> DefiningFunctionsList;
+ // The list of function declaration IDs (in the order found) that
+ // aren't just proto declarations.
+ // TODO(kschimpf): Instead of using this list, just use
+ // FunctionDeclarationList, and the isProto member function.
+ std::vector<unsigned> DefiningFunctionDeclarationsList;
// Error recovery value to use when getFuncSigTypeByID fails.
Ice::FuncSigType UndefinedFuncSigType;
@@ -423,6 +428,14 @@ private:
void reportBadTypeIDAs(unsigned ID, const ExtendedType *Ty,
ExtendedType::TypeKind WantedType);
+ // Reports that there is no function declaration for ID. Returns an
+ // error recovery value to use.
+ Ice::FunctionDeclaration *reportGetFunctionByIDError(unsigned ID);
+
+ // Reports that there is not global variable declaration for
+ // ID. Returns an error recovery value to use.
+ Ice::VariableDeclaration *reportGetGlobalVariableByIDError(unsigned Index);
+
// Reports that there is no corresponding ICE type for LLVMTy, and
// returns ICE::IceType_void.
Ice::Type convertToIceTypeError(Type *LLVMTy);
@@ -440,6 +453,34 @@ void TopLevelParser::reportBadTypeIDAs(unsigned ID, const ExtendedType *Ty,
Error(StrBuf.str());
}
+Ice::FunctionDeclaration *
+TopLevelParser::reportGetFunctionByIDError(unsigned ID) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Function index " << ID
+ << " not allowed. Out of range. Must be less than "
+ << FunctionDeclarationList.size();
+ Error(StrBuf.str());
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ if (!FunctionDeclarationList.empty())
+ return FunctionDeclarationList[0];
+ report_fatal_error("Unable to continue");
+}
+
+Ice::VariableDeclaration *
+TopLevelParser::reportGetGlobalVariableByIDError(unsigned Index) {
+ std::string Buffer;
+ raw_string_ostream StrBuf(Buffer);
+ StrBuf << "Global index " << Index
+ << " not allowed. Out of range. Must be less than "
+ << VariableDeclarations.size();
+ Error(StrBuf.str());
+ // TODO(kschimpf) Remove error recovery once implementation complete.
+ if (!VariableDeclarations.empty())
+ return VariableDeclarations[0];
+ report_fatal_error("Unable to continue");
+}
+
Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
@@ -747,38 +788,40 @@ void TypesParser::ProcessRecord() {
llvm_unreachable("Unknown type block record not processed!");
}
-/// Parses the globals block (i.e. global variables).
+/// Parses the globals block (i.e. global variable declarations and
+/// corresponding initializers).
class GlobalsParser : public BlockParserBaseClass {
public:
GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
: BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0),
- NextGlobalID(0), CurrentAddress(&DummyAddress) {}
-
- ~GlobalsParser() override {}
+ NextGlobalID(0), DummyGlobalVar(Ice::VariableDeclaration::create(
+ getTranslator().getContext())),
+ CurGlobalVar(DummyGlobalVar) {}
private:
// Keeps track of how many initializers are expected for the global variable
- // being built.
+ // declaration being built.
unsigned InitializersNeeded;
- // The index of the next global variable.
+ // The index of the next global variable declaration.
unsigned NextGlobalID;
- // Holds the current global address whose initializer is being defined.
- Ice::GlobalAddress *CurrentAddress;
+ // Dummy global variable declaration to guarantee CurGlobalVar is
+ // always defined (allowing code to not need to check if
+ // CurGlobalVar is nullptr).
+ Ice::VariableDeclaration *DummyGlobalVar;
- // Dummy global address to guarantee CurrentAddress is always defined
- // (allowing code to not need to check if CurrentAddress is nullptr).
- Ice::GlobalAddress DummyAddress;
+ // Holds the current global variable declaration being built.
+ Ice::VariableDeclaration *CurGlobalVar;
void ExitBlock() override {
verifyNoMissingInitializers();
- unsigned NumIDs = Context->getNumGlobalAddresses();
+ unsigned NumIDs = Context->getNumGlobalVariables();
if (NextGlobalID < NumIDs) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
StrBuf << "Globals block expects " << NumIDs
- << " global definitions. Found: " << NextGlobalID;
+ << " global variable declarations. Found: " << NextGlobalID;
Error(StrBuf.str());
}
BlockParserBaseClass::ExitBlock();
@@ -786,12 +829,12 @@ private:
void ProcessRecord() override;
- // Checks if the number of initializers for the CurrentAddress is the same as
+ // Checks if the number of initializers for the CurGlobalVar is the same as
// the number found in the bitcode file. If different, and error message is
// generated, and the internal state of the parser is fixed so this condition
// is no longer violated.
void verifyNoMissingInitializers() {
- size_t NumInits = CurrentAddress->getInitializers().size();
+ size_t NumInits = CurGlobalVar->getInitializers().size();
if (InitializersNeeded != NumInits) {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
@@ -801,6 +844,7 @@ private:
StrBuf << "s";
StrBuf << ". Found: " << NumInits;
Error(StrBuf.str());
+ InitializersNeeded = NumInits;
}
}
};
@@ -812,11 +856,11 @@ void GlobalsParser::ProcessRecord() {
// COUNT: [n]
if (!isValidRecordSize(1, "Globals count"))
return;
- if (NextGlobalID != Context->getNumGlobalAddresses()) {
+ if (NextGlobalID != Context->getNumGlobalVariables()) {
Error("Globals count record not first in block.");
return;
}
- Context->CreateGlobalAddresses(Values[0]);
+ Context->CreateGlobalVariables(Values[0]);
return;
case naclbitc::GLOBALVAR_VAR: {
// VAR: [align, isconst]
@@ -824,9 +868,9 @@ void GlobalsParser::ProcessRecord() {
return;
verifyNoMissingInitializers();
InitializersNeeded = 1;
- CurrentAddress = Context->getGlobalAddress(NextGlobalID);
- CurrentAddress->setAlignment((1 << Values[0]) >> 1);
- CurrentAddress->setIsConstant(Values[1] != 0);
+ CurGlobalVar = Context->getGlobalVariableByID(NextGlobalID);
+ CurGlobalVar->setAlignment((1 << Values[0]) >> 1);
+ CurGlobalVar->setIsConstant(Values[1] != 0);
++NextGlobalID;
return;
}
@@ -834,7 +878,7 @@ void GlobalsParser::ProcessRecord() {
// COMPOUND: [size]
if (!isValidRecordSize(1, "globals compound"))
return;
- if (!CurrentAddress->getInitializers().empty()) {
+ if (!CurGlobalVar->getInitializers().empty()) {
Error("Globals compound record not first initializer");
return;
}
@@ -851,17 +895,17 @@ void GlobalsParser::ProcessRecord() {
// ZEROFILL: [size]
if (!isValidRecordSize(1, "Globals zerofill"))
return;
- CurrentAddress->addInitializer(
- new Ice::GlobalAddress::ZeroInitializer(Values[0]));
- break;
+ CurGlobalVar->addInitializer(
+ new Ice::VariableDeclaration::ZeroInitializer(Values[0]));
+ return;
}
case naclbitc::GLOBALVAR_DATA: {
// DATA: [b0, b1, ...]
if (!isValidRecordSizeAtLeast(1, "Globals data"))
return;
- CurrentAddress->addInitializer(
- new Ice::GlobalAddress::DataInitializer(Values));
- break;
+ CurGlobalVar->addInitializer(
+ new Ice::VariableDeclaration::DataInitializer(Values));
+ return;
}
case naclbitc::GLOBALVAR_RELOC: {
// RELOC: [val, [addend]]
@@ -871,19 +915,9 @@ void GlobalsParser::ProcessRecord() {
Ice::SizeT Offset = 0;
if (Values.size() == 2)
Offset = Values[1];
- unsigned NumFunctions = Context->getNumFunctionIDs();
- if (Index < NumFunctions) {
- llvm::Function *Fcn = Context->getFunctionByID(Index);
- Ice::GlobalAddress::RelocationAddress Addr(Fcn);
- CurrentAddress->addInitializer(
- new Ice::GlobalAddress::RelocInitializer(Addr, Offset));
- } else {
- Ice::GlobalAddress::RelocationAddress Addr(
- Context->getGlobalAddress(Index - NumFunctions));
- CurrentAddress->addInitializer(
- new Ice::GlobalAddress::RelocInitializer(Addr, Offset));
- }
- break;
+ CurGlobalVar->addInitializer(new Ice::VariableDeclaration::RelocInitializer(
+ Context->getGlobalDeclarationByID(Index), Offset));
+ return;
}
default:
BlockParserBaseClass::ProcessRecord();
@@ -964,23 +998,25 @@ public:
: BlockParserBaseClass(BlockID, EnclosingParser),
Func(new Ice::Cfg(getTranslator().getContext())), CurrentBbIndex(0),
FcnId(Context->getNextFunctionBlockValueID()),
- LLVMFunc(Context->getFunctionByID(FcnId)),
+ FuncDecl(Context->getFunctionByID(FcnId)),
CachedNumGlobalValueIDs(Context->getNumGlobalIDs()),
NextLocalInstIndex(Context->getNumGlobalIDs()),
InstIsTerminating(false) {
- Func->setFunctionName(LLVMFunc->getName());
+ Func->setFunctionName(FuncDecl->getName());
if (getFlags().TimeEachFunction)
getTranslator().getContext()->pushTimer(
getTranslator().getContext()->getTimerID(
Ice::GlobalContext::TSK_Funcs, Func->getFunctionName()),
Ice::GlobalContext::TSK_Funcs);
- Func->setReturnType(Context->convertToIceType(LLVMFunc->getReturnType()));
- Func->setInternal(LLVMFunc->hasInternalLinkage());
+ // TODO(kschimpf) Clean up API to add a function signature to
+ // a CFG.
+ const Ice::FuncSigType &Signature = FuncDecl->getSignature();
+ Func->setReturnType(Signature.getReturnType());
+ Func->setInternal(FuncDecl->getLinkage() == GlobalValue::InternalLinkage);
CurrentNode = InstallNextBasicBlock();
Func->setEntryNode(CurrentNode);
- for (auto ArgI = LLVMFunc->arg_begin(), ArgE = LLVMFunc->arg_end();
- ArgI != ArgE; ++ArgI) {
- Func->addArg(getNextInstVar(Context->convertToIceType(ArgI->getType())));
+ for (Ice::Type ArgType : Signature.getArgList()) {
+ Func->addArg(getNextInstVar(ArgType));
}
}
@@ -1000,8 +1036,8 @@ private:
Ice::CfgNode *CurrentNode;
// The ID for the function.
unsigned FcnId;
- // The corresponding LLVM function.
- Function *LLVMFunc;
+ // The corresponding function declaration.
+ Ice::FunctionDeclaration *FuncDecl;
// Holds the dividing point between local and global absolute value indices.
uint32_t CachedNumGlobalValueIDs;
// Holds operands local to the function block, based on indices
@@ -1999,12 +2035,12 @@ void FunctionParser::ProcessRecord() {
// CALL_INDIRECT: [cc, fn, returnty, args...]
//
// Note: The difference between CALL and CALL_INDIRECT is that
- // CALL has an explicit function address, while the CALL_INDIRECT
- // is just an address. For CALL, we can infer the return type by
- // looking up the type signature associated with the function
- // address. For CALL_INDIRECT we can only infer the type signature
- // via argument types, and the corresponding return type stored in
- // CALL_INDIRECT record.
+ // CALL has a reference to an explicit function declaration, while
+ // the CALL_INDIRECT is just an address. For CALL, we can infer
+ // the return type by looking up the type signature associated
+ // with the function declaration. For CALL_INDIRECT we can only
+ // infer the type signature via argument types, and the
+ // corresponding return type stored in CALL_INDIRECT record.
Ice::SizeT ParamsStartIndex = 2;
if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
if (!isValidRecordSizeAtLeast(2, "function block call"))
@@ -2034,17 +2070,9 @@ void FunctionParser::ProcessRecord() {
Ice::Type ReturnType = Ice::IceType_void;
const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
- Function *Fcn = Context->getFunctionByID(CalleeIndex);
- if (Fcn == nullptr) {
- std::string Buffer;
- raw_string_ostream StrBuf(Buffer);
- StrBuf << "Function call to non-function: " << *Callee;
- Error(StrBuf.str());
- return;
- }
-
- FunctionType *FcnTy = Fcn->getFunctionType();
- ReturnType = Context->convertToIceType(FcnTy->getReturnType());
+ Ice::FunctionDeclaration *Fcn = Context->getFunctionByID(CalleeIndex);
+ const Ice::FuncSigType &Signature = Fcn->getSignature();
+ ReturnType = Signature.getReturnType();
// Check if this direct call is to an Intrinsic (starts with "llvm.")
static Ice::IceString LLVMPrefix("llvm.");
@@ -2339,45 +2367,60 @@ class ModuleParser : public BlockParserBaseClass {
public:
ModuleParser(unsigned BlockID, TopLevelParser *Context)
: BlockParserBaseClass(BlockID, Context),
- GlobalAddressNamesAndInitializersInstalled(false) {}
+ GlobalDeclarationNamesAndInitializersInstalled(false) {}
~ModuleParser() override {}
private:
- // True if we have already instaledl names for unnamed global addresses,
- // and generated global constant initializers.
- bool GlobalAddressNamesAndInitializersInstalled;
-
- // Generates names for unnamed global addresses, and lowers global
- // constant initializers to the target. May be called multiple
- // times. Only the first call will do the installation.
- void InstallGlobalAddressNamesAndInitializers() {
- if (!GlobalAddressNamesAndInitializersInstalled) {
+ // True if we have already installed names for unnamed global declarations,
+ // and have generated global constant initializers.
+ bool GlobalDeclarationNamesAndInitializersInstalled;
+
+ // Generates names for unnamed global addresses (i.e. functions and
+ // global variables). Then lowers global variable declaration
+ // initializers to the target. May be called multiple times. Only
+ // the first call will do the installation.
+ void InstallGlobalNamesAndGlobalVarInitializers() {
+ if (!GlobalDeclarationNamesAndInitializersInstalled) {
Ice::Translator &Trans = getTranslator();
const Ice::IceString &GlobalPrefix = getFlags().DefaultGlobalPrefix;
if (!GlobalPrefix.empty()) {
uint32_t NameIndex = 0;
- for (Ice::GlobalAddress *Address : Context->getGlobalIDAddresses()) {
- if (!Address->hasName()) {
- Address->setName(Trans.createUnnamedName(GlobalPrefix, NameIndex));
- ++NameIndex;
- } else {
- Trans.checkIfUnnamedNameSafe(Address->getName(), "global",
- GlobalPrefix,
- Trans.getContext()->getStrDump());
- }
+ for (Ice::VariableDeclaration *Var : Context->getGlobalVariables()) {
+ installDeclarationName(Trans, Var, GlobalPrefix, "global", NameIndex);
+ }
+ }
+ const Ice::IceString &FunctionPrefix = getFlags().DefaultFunctionPrefix;
+ if (!FunctionPrefix.empty()) {
+ uint32_t NameIndex = 0;
+ for (Ice::FunctionDeclaration *Func :
+ Context->getFunctionDeclarationList()) {
+ installDeclarationName(Trans, Func, FunctionPrefix, "function",
+ NameIndex);
}
}
- Trans.nameUnnamedFunctions(Context->getModule());
- getTranslator().lowerGlobals(Context->getGlobalIDAddresses());
- GlobalAddressNamesAndInitializersInstalled = true;
+ getTranslator().lowerGlobals(Context->getGlobalVariables());
+ GlobalDeclarationNamesAndInitializersInstalled = true;
+ }
+ }
+
+ void installDeclarationName(Ice::Translator &Trans,
+ Ice::GlobalDeclaration *Decl,
+ const Ice::IceString &Prefix, const char *Context,
+ uint32_t &NameIndex) {
+ if (!Decl->hasName()) {
+ Decl->setName(Trans.createUnnamedName(Prefix, NameIndex));
+ ++NameIndex;
+ } else {
+ Trans.checkIfUnnamedNameSafe(Decl->getName(), Context, Prefix,
+ Trans.getContext()->getStrDump());
}
}
bool ParseBlock(unsigned BlockID) override;
void ExitBlock() override {
- InstallGlobalAddressNamesAndInitializers();
+ InstallGlobalNamesAndGlobalVarInitializers();
getTranslator().emitConstants();
}
@@ -2400,26 +2443,8 @@ private:
};
void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) {
- if (Index < Context->getNumFunctionIDs()) {
- Function *Fcn = Context->getFunctionByID(Index);
- if (Fcn != nullptr) {
- Fcn->setName(StringRef(Name.data(), Name.size()));
- return;
- }
- } else {
- unsigned NumFunctions = Context->getNumFunctionIDs();
- if (Index >= NumFunctions) {
- Context->getGlobalAddress(Index - NumFunctions)
- ->setName(StringRef(Name.data(), Name.size()));
- }
- return;
- }
-
- std::string Buffer;
- raw_string_ostream StrBuf(Buffer);
- StrBuf << "Invalid global address ID in valuesymtab: " << Index;
- Error(StrBuf.str());
- return;
+ Context->getGlobalDeclarationByID(Index)
+ ->setName(StringRef(Name.data(), Name.size()));
}
void ModuleValuesymtabParser::setBbName(uint64_t Index, StringType &Name) {
@@ -2447,7 +2472,7 @@ bool ModuleParser::ParseBlock(unsigned BlockID) {
return Parser.ParseThisBlock();
}
case naclbitc::FUNCTION_BLOCK_ID: {
- InstallGlobalAddressNamesAndInitializers();
+ InstallGlobalNamesAndGlobalVarInitializers();
FunctionParser Parser(BlockID, this);
return Parser.ParseThisBlock();
}
@@ -2476,7 +2501,7 @@ void ModuleParser::ProcessRecord() {
// FUNCTION: [type, callingconv, isproto, linkage]
if (!isValidRecordSize(4, "Function heading"))
return;
- const Ice::FuncSigType &Ty = Context->getFuncSigTypeByID(Values[0]);
+ const Ice::FuncSigType &Signature = Context->getFuncSigTypeByID(Values[0]);
CallingConv::ID CallingConv;
if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) {
std::string Buffer;
@@ -2494,19 +2519,12 @@ void ModuleParser::ProcessRecord() {
Error(StrBuf.str());
return;
}
- SmallVector<Type *, 8> ArgTys;
- for (Ice::Type ArgType : Ty.getArgList()) {
- ArgTys.push_back(Context->convertToLLVMType(ArgType));
- }
- Function *Func = Function::Create(
- FunctionType::get(Context->convertToLLVMType(Ty.getReturnType()),
- ArgTys, false),
- Linkage, "", Context->getModule());
- Func->setCallingConv(CallingConv);
+ Ice::FunctionDeclaration *Func = Ice::FunctionDeclaration::create(
+ getTranslator().getContext(), Signature, CallingConv, Linkage,
+ Values[2] == 0);
if (Values[2] == 0)
Context->setNextValueIDAsImplementedFunction();
Context->setNextFunctionID(Func);
- // TODO(kschimpf) verify if Func matches PNaCl ABI.
return;
}
default:
« no previous file with comments | « src/IceTranslator.cpp ('k') | tests_lit/llvm2ice_tests/globalrelocs.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698