Skip to content

Commit

Permalink
Inline fake snprintf to avoid linkage issues on Windows.
Browse files Browse the repository at this point in the history
Summary:
dllexport doesn't work if linking against a static library with its own
copy of snprintf.

Reviewers: zturner

Subscribers: zturner, lldb-commits

Differential Revision: http://reviews.llvm.org/D12206

llvm-svn: 245610
  • Loading branch information
chaoren committed Aug 20, 2015
1 parent 419bb33 commit ee3c206
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
15 changes: 13 additions & 2 deletions lldb/include/lldb/Host/windows/win32.h
Expand Up @@ -65,8 +65,19 @@ int strcasecmp(const char* s1, const char* s2);
int strncasecmp(const char* s1, const char* s2, size_t n);

#if _MSC_VER < 1900
int __declspec(dllexport)
snprintf(char *buffer, size_t count, const char *format, ...);
namespace lldb_private {
int vsnprintf(char *buffer, size_t count, const char *format, va_list argptr);
}

// inline to avoid linkage conflicts
int inline snprintf(char *buffer, size_t count, const char *format, ...)
{
va_list argptr;
va_start(argptr, format);
int r = lldb_private::vsnprintf(buffer, count, format, argptr);
va_end(argptr);
return r;
}
#endif

#define STDIN_FILENO 0
Expand Down
11 changes: 5 additions & 6 deletions lldb/source/Host/windows/Windows.cpp
Expand Up @@ -203,18 +203,17 @@ int usleep(uint32_t useconds)
}

#if _MSC_VER < 1900
int snprintf(char *buffer, size_t count, const char *format, ...)
namespace lldb_private {
int vsnprintf(char *buffer, size_t count, const char *format, va_list argptr)
{
int old_errno = errno;
va_list argptr;
va_start(argptr, format);
int r = vsnprintf(buffer, count, format, argptr);
int r = ::vsnprintf(buffer, count, format, argptr);
int new_errno = errno;
buffer[count-1] = '\0';
if (r == -1 || r == count)
{
FILE *nul = fopen("nul", "w");
int bytes_written = vfprintf(nul, format, argptr);
int bytes_written = ::vfprintf(nul, format, argptr);
fclose(nul);
if (bytes_written < count)
errno = new_errno;
Expand All @@ -224,9 +223,9 @@ int snprintf(char *buffer, size_t count, const char *format, ...)
r = bytes_written;
}
}
va_end(argptr);
return r;
}
} // namespace lldb_private
#endif

#endif // _MSC_VER

0 comments on commit ee3c206

Please sign in to comment.