diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-01-19 21:41:04 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-01-19 21:41:04 +0000 |
commit | 02f20d3d9bd99b2f5ffd7bfd96dc3f366645abd9 (patch) | |
tree | 4f41659a2a944343acee39df9ac7879906acc935 /lib/System/DynamicLibrary.cpp | |
parent | 81e3954dc9dc3416c24cb82a0fd6b72576baede8 (diff) |
Help the lli interpreter find the stderr/stdin/stdout symbols. These are
needed for output to be generated. On Linux these are both global vars and
macro definitions so we have to special case Linux.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33374 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/DynamicLibrary.cpp')
-rw-r--r-- | lib/System/DynamicLibrary.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp index d4bf0f797f..b84c40fb30 100644 --- a/lib/System/DynamicLibrary.cpp +++ b/lib/System/DynamicLibrary.cpp @@ -164,11 +164,23 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { } #undef EXPLICIT_SYMBOL #endif + +// This macro returns the address of a well-known, explicit symbol #define EXPLICIT_SYMBOL(SYM) \ if (!strcmp(symbolName, #SYM)) return &SYM - // Try a few well known symbols just to give lli a shot at working. - // Note that on some systems stdin, etc. are macros so we have to - // avoid attempting to take the address of a macro :) + +// On linux we have a weird situation. The stderr/out/in symbols are both +// macros and global variables because of standards requirements. So, we +// boldly use the EXPLICIT_SYMBOL macro without checking for a #define first. +#if defined(__linux__) + { + EXPLICIT_SYMBOL(stderr); + EXPLICIT_SYMBOL(stdout); + EXPLICIT_SYMBOL(stdin); + } +#else + // For everything else, we want to check to make sure the symbol isn't defined + // as a macro before using EXPLICIT_SYMBOL. { #ifndef stdin EXPLICIT_SYMBOL(stdin); @@ -179,7 +191,11 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { #ifndef stderr EXPLICIT_SYMBOL(stderr); #endif +#ifndef errno + EXPLICIT_SYMBOL(errno); +#endif } +#endif #undef EXPLICIT_SYMBOL return 0; |