aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/CppBackend/CPPBackend.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-11-27 16:24:29 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-11-27 16:24:29 -0800
commit80cfca15b72924c4c3b6b4e3b2c6b88d114ddc73 (patch)
treeb880f2d27f79348afadeebf095393956ce831d02 /lib/Target/CppBackend/CPPBackend.cpp
parent9e010fadc279bf93533781c5bffba928301a16d6 (diff)
emit externals
Diffstat (limited to 'lib/Target/CppBackend/CPPBackend.cpp')
-rw-r--r--lib/Target/CppBackend/CPPBackend.cpp21
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();