From 02f20d3d9bd99b2f5ffd7bfd96dc3f366645abd9 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Fri, 19 Jan 2007 21:41:04 +0000 Subject: [PATCH] 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 --- lib/System/DynamicLibrary.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp index d4bf0f797fc..b84c40fb308 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); @@ -178,8 +190,12 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { #endif #ifndef stderr EXPLICIT_SYMBOL(stderr); +#endif +#ifndef errno + EXPLICIT_SYMBOL(errno); #endif } +#endif #undef EXPLICIT_SYMBOL return 0; -- 2.34.1