summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-04-28 13:12:12 (GMT)
committerKitware Robot <kwrobot@kitware.com>2017-04-28 13:12:22 (GMT)
commit34a083a1951306aa9d0c0a5f14ac17706f475546 (patch)
tree4c17561db121d8014b85e10925bb7360b0a30b74
parent02d11868827417e88cbbee795703421dfdb342f6 (diff)
parentafb21342ead475a12636f29f7cd77cbe38d05ed1 (diff)
downloadCMake-34a083a1951306aa9d0c0a5f14ac17706f475546.zip
CMake-34a083a1951306aa9d0c0a5f14ac17706f475546.tar.gz
CMake-34a083a1951306aa9d0c0a5f14ac17706f475546.tar.bz2
Merge topic 'bindexplib-consts'
afb21342 bindexplib: fix constants symbols export Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !763
-rw-r--r--Source/bindexplib.cxx32
-rw-r--r--Tests/RunCMake/AutoExportDll/foo.c2
-rw-r--r--Tests/RunCMake/AutoExportDll/say.cxx10
3 files changed, 25 insertions, 19 deletions
diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx
index 6026a57..691e3ae 100644
--- a/Source/bindexplib.cxx
+++ b/Source/bindexplib.cxx
@@ -235,35 +235,29 @@ public:
symbol.erase(posAt);
}
}
- // For i386 builds we don't need to remove _
+ // For i386 builds we need to remove _
if (this->IsI386 && symbol[0] == '_') {
symbol.erase(0, 1);
}
- /*
- Check whether it is "Scalar deleting destructor" and
- "Vector deleting destructor"
- */
+ // Check whether it is "Scalar deleting destructor" and "Vector
+ // deleting destructor"
+ // if scalarPrefix and vectorPrefix are not found then print the
+ // symbol
const char* scalarPrefix = "??_G";
const char* vectorPrefix = "??_E";
- // original code had a check for
- // symbol.find("real@") == std::string::npos)
- // but if this disallows memmber functions with the name real
- // if scalarPrefix and vectorPrefix are not found then print
- // the symbol
if (symbol.compare(0, 4, scalarPrefix) &&
symbol.compare(0, 4, vectorPrefix)) {
SectChar = this->SectionHeaders[pSymbolTable->SectionNumber - 1]
.Characteristics;
- if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) {
- // Read only (i.e. constants) must be excluded
- this->DataSymbols.insert(symbol);
- } else {
- if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) ||
- (SectChar & IMAGE_SCN_MEM_EXECUTE)) {
- this->Symbols.insert(symbol);
- } else {
- // printf(" strange symbol: %s \n",symbol.c_str());
+
+ if (SectChar & IMAGE_SCN_MEM_EXECUTE) {
+ this->Symbols.insert(symbol);
+ } else if (SectChar & IMAGE_SCN_MEM_READ) {
+ // skip __real@ and __xmm@
+ if (symbol.find("_real") == std::string::npos &&
+ symbol.find("_xmm") == std::string::npos) {
+ this->DataSymbols.insert(symbol);
}
}
}
diff --git a/Tests/RunCMake/AutoExportDll/foo.c b/Tests/RunCMake/AutoExportDll/foo.c
index 4b1318b..e70fbb5 100644
--- a/Tests/RunCMake/AutoExportDll/foo.c
+++ b/Tests/RunCMake/AutoExportDll/foo.c
@@ -13,3 +13,5 @@ int bar()
{
return 5;
}
+
+const char testconst[] = "testconst";
diff --git a/Tests/RunCMake/AutoExportDll/say.cxx b/Tests/RunCMake/AutoExportDll/say.cxx
index 51060e8..eb9c0ff 100644
--- a/Tests/RunCMake/AutoExportDll/say.cxx
+++ b/Tests/RunCMake/AutoExportDll/say.cxx
@@ -13,6 +13,14 @@ int WINAPI foo();
int bar();
int objlib();
void justnop();
+
+// test const export
+#ifdef _WIN32
+// data symbols must be explicitly imported
+__declspec(dllimport) extern const char testconst[];
+#else
+extern const char testconst[];
+#endif
}
// test c++ functions
@@ -43,6 +51,8 @@ int main()
bar();
objlib();
printf("\n");
+ printf("%s", testconst);
+ printf("\n");
#ifdef HAS_JUSTNOP
justnop();
#endif