Index: lib/tsan/rtl/tsan_platform_mac.cc =================================================================== --- lib/tsan/rtl/tsan_platform_mac.cc +++ lib/tsan/rtl/tsan_platform_mac.cc @@ -39,6 +39,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace __tsan { @@ -98,6 +103,37 @@ } #endif +static bool IsInSegmentRange(uptr addr, mach_header_64 *mh, + const char *segname, const char *sectname) { + const section_64 *sect = getsectbynamefromheader_64(mh, segname, sectname); + if (!sect) + return false; + return addr >= sect->addr && addr < (sect->addr + sect->size); +} + +static bool IsInitedGlobal(uptr addr, mach_header_64 *mh) { + return IsInSegmentRange(addr, mh, SEG_DATA, SECT_DATA); +} + +static bool IsUninitedGlobal(uptr addr, mach_header_64 *mh) { + return IsInSegmentRange(addr, mh, SEG_DATA, SECT_COMMON); +} + +static bool IsStringLiteral(uptr addr, mach_header_64 *mh) { + return IsInSegmentRange(addr, mh, SEG_TEXT, "__cstring"); +} + + +static bool IsInitedConst(uptr addr, mach_header_64 *mh) { + return IsInSegmentRange(addr, mh, SEG_TEXT, "__const"); +} + +static bool IsByteLiteral(uptr addr, mach_header_64 *mh, unsigned bytes) { + CHECK(bytes == 4 || bytes == 8); + return IsInSegmentRange(addr, mh, SEG_TEXT, + bytes == 4 ? "__literal4" : "__literal8"); +} + uptr GetShadowMemoryConsumption() { return 0; } @@ -179,7 +215,13 @@ #endif bool IsGlobalVar(uptr addr) { - return false; + Dl_info info; + if (!dladdr((void*)addr, &info)) + return false; + mach_header_64 *mh = reinterpret_cast(info.dli_fbase); + return IsUninitedGlobal(addr, mh) || IsInitedGlobal(addr, mh) || + IsStringLiteral(addr, mh) || IsInitedConst(addr, mh) || + IsByteLiteral(addr, mh, 4) || IsByteLiteral(addr, mh, 8); } } // namespace __tsan