diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-11-27 16:24:29 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-11-27 16:24:29 -0800 |
commit | 80cfca15b72924c4c3b6b4e3b2c6b88d114ddc73 (patch) | |
tree | b880f2d27f79348afadeebf095393956ce831d02 /lib/Target/CppBackend/CPPBackend.cpp | |
parent | 9e010fadc279bf93533781c5bffba928301a16d6 (diff) |
emit externals
Diffstat (limited to 'lib/Target/CppBackend/CPPBackend.cpp')
-rw-r--r-- | lib/Target/CppBackend/CPPBackend.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp index 0d11b9af6c..7b7d0b0cff 100644 --- a/lib/Target/CppBackend/CPPBackend.cpp +++ b/lib/Target/CppBackend/CPPBackend.cpp @@ -138,6 +138,7 @@ namespace { HeapData GlobalData32; HeapData GlobalData64; GlobalAddressMap GlobalAddresses; + NameSet Externals; #include "CallHandlers.h" @@ -1217,6 +1218,13 @@ std::string CppWriter::getPtrUse(const Value* Ptr) { std::string CppWriter::getPtr(const Value* Ptr) { if (const Constant *CV = dyn_cast<Constant>(Ptr)) { + if (const GlobalValue *GV = dyn_cast<GlobalValue>(Ptr)) { + if (GV->hasExternalLinkage()) { + std::string Name = getOpName(Ptr); + Externals.insert(Name); + return Name; + } + } return utostr(getGlobalAddress(CV->getName().str())); } else { return getOpName(Ptr); @@ -1225,6 +1233,7 @@ std::string CppWriter::getPtr(const Value* Ptr) { std::string CppWriter::getConstant(const Constant* CV, Signedness sign) { if (isa<PointerType>(CV->getType())) { + return getPtr(CV); } else { if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { @@ -2257,6 +2266,18 @@ void CppWriter::printModuleBody() { } } Out << "],"; + Out << "\"externs\": ["; + first = true; + for (NameSet::iterator I = Externals.begin(), E = Externals.end(); + I != E; ++I) { + if (first) { + first = false; + } else { + Out << ", "; + } + Out << "\"" + *I + "\""; + } + Out << "],"; Out << "\"implementedFunctions\": ["; first = true; for (Module::const_iterator I = TheModule->begin(), E = TheModule->end(); |