[llvm-commits] [compiler-rt] r161045 - in /compiler-rt/trunk/lib/sanitizer_common: CMakeLists.txt sanitizer_symbolizer.cc sanitizer_symbolizer.h sanitizer_symbolizer_llvm.cc
Alexey Samsonov
samsonov at google.com
Tue Aug 14 06:03:23 PDT 2012
On Tue, Aug 14, 2012 at 11:22 AM, Dmitry Vyukov <dvyukov at google.com> wrote:
> On Tue, Aug 14, 2012 at 11:01 AM, Alexey Samsonov <samsonov at google.com>wrote:
>
>> On Mon, Aug 13, 2012 at 10:47 PM, Dmitry Vyukov <dvyukov at google.com>wrote:
>>
>>> This breaks Go runtime:
>>>
>>> gcc gotsan.cc -S -o tmp.s -I../rtl -I../.. -I../../sanitizer_common
>>> -fPIC -g -Wall -Werror -fno-exceptions -DTSAN_GO -DSANITIZER_GO
>>> -DTSAN_SHADOW_COUNT=4 -DTSAN_DEBUG=0 -O3 -fomit-frame-pointer -ffreestanding
>>> as gotsan.s -o race_linux_amd64.syso
>>> /usr/bin/ld.gold: race_linux_amd64.syso: in function
>>> __sanitizer::dl_iterate_phdr_cb(dl_phdr_info*, unsigned long,
>>> void*):gotsan.cc:4485: error: undefined reference to
>>> '__sanitizer::ModuleDIContext::ModuleDIContext(char const*, unsigned long)'
>>> /usr/bin/ld.gold: race_linux_amd64.syso: in function
>>> __sanitizer::dl_iterate_phdr_cb(dl_phdr_info*, unsigned long,
>>> void*):gotsan.cc:4492: error: undefined reference to
>>> '__sanitizer::ModuleDIContext::addAddressRange(unsigned long, unsigned
>>> long)'
>>> /usr/bin/ld.gold: race_linux_amd64.syso: in function
>>> __sanitizer::FindDWARFSection(unsigned long, char const*,
>>> __sanitizer::DWARFSection*):gotsan.cc:4442: error: undefined reference to
>>> '__sanitizer::IsFullNameOfDWARFSection(char const*, char const*)'
>>> collect2: ld returned 1 exit status
>>>
>>> Please keep everything related to symbolization in separate files as it
>>> makes sense only for C/C++.
>>>
>>
>> I can, but then I'd have to create even more OS-specific files
>> (sanitizer_symoblizer_win, sanitizer_symbolizer_linux etc.) in parallel to
>> existing OS-specific files in sanitizer_common.
>>
>
> I think that's good.
>
>
>> Why can't you include all the sources into go runtime? To save the size
>> or because it's the Wrong thing to do?
>>
>
> There are several reasons. Size of runtime matters. It will require parts
> of llvm as well, but Go runtime is very restricted in what it can contain
> (no global ctors, no weak symbols, no deps on libstdc++, etc), I do not
> think that llvm satisfies the requirements. And I think it is the wrong
> thing to do.
>
r161862
>
>
>
> On Tue, Jul 31, 2012 at 3:51 PM, Alexey Samsonov <samsonov at google.com>wrote:
>>>
>>>> Author: samsonov
>>>> Date: Tue Jul 31 06:51:26 2012
>>>> New Revision: 161045
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=161045&view=rev
>>>> Log:
>>>> [Sanitizer] Wrapper around llvm::DIContext from LLVM DebugInfo library.
>>>> If a macro SANITIZER_USES_LLVM_LIBS is defined (by default it is not), then
>>>> sanitizer runtime includes llvm headers and tries to use LLVM libs for
>>>> in-process symbolization. To make it functional, we have to link with these
>>>> LLVM libs - either pass them to linker from Clang driver, or link them into
>>>> static ASan runtime when we build it.
>>>>
>>>> Added:
>>>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_llvm.cc
>>>> Modified:
>>>> compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
>>>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc
>>>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
>>>>
>>>> Modified: compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt?rev=161045&r1=161044&r2=161045&view=diff
>>>>
>>>> ==============================================================================
>>>> --- compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt (original)
>>>> +++ compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt Tue Jul 31
>>>> 06:51:26 2012
>>>> @@ -11,13 +11,15 @@
>>>> sanitizer_posix.cc
>>>> sanitizer_printf.cc
>>>> sanitizer_symbolizer.cc
>>>> + sanitizer_symbolizer_llvm.cc
>>>> sanitizer_win.cc
>>>> )
>>>>
>>>> set(SANITIZER_CFLAGS "-fPIC -fno-exceptions -funwind-tables
>>>> -fvisibility=hidden")
>>>>
>>>> set(SANITIZER_COMMON_DEFINITIONS
>>>> - SANITIZER_HAS_EXCEPTIONS=1)
>>>> + SANITIZER_HAS_EXCEPTIONS=1
>>>> + )
>>>>
>>>> if(CAN_TARGET_X86_64)
>>>> add_library(RTSanitizerCommon.x86_64 OBJECT ${SANITIZER_SOURCES})
>>>>
>>>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc?rev=161045&r1=161044&r2=161045&view=diff
>>>>
>>>> ==============================================================================
>>>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc
>>>> (original)
>>>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc Tue
>>>> Jul 31 06:51:26 2012
>>>> @@ -7,13 +7,11 @@
>>>> //
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>> //
>>>> -// This is a stub for LLVM-based symbolizer.
>>>> // This file is shared between AddressSanitizer and ThreadSanitizer
>>>> -// run-time libraries. See sanitizer.h for details.
>>>> +// run-time libraries. See sanitizer_symbolizer.h for details.
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>>
>>>> #include "sanitizer_common.h"
>>>> -#include "sanitizer_placement_new.h"
>>>> #include "sanitizer_procmaps.h"
>>>> #include "sanitizer_symbolizer.h"
>>>>
>>>> @@ -50,6 +48,7 @@
>>>> n_ranges_ = 0;
>>>> mapped_addr_ = 0;
>>>> mapped_size_ = 0;
>>>> + dwarf_context_ = 0;
>>>> }
>>>>
>>>> void ModuleDIContext::addAddressRange(uptr beg, uptr end) {
>>>> @@ -71,29 +70,25 @@
>>>> info->module = internal_strdup(full_name_);
>>>> info->module_offset = info->address - base_address_;
>>>> if (mapped_addr_ == 0)
>>>> - CreateDIContext();
>>>> - // FIXME: Use the actual debug info context here.
>>>> - info->function = 0;
>>>> - info->file = 0;
>>>> - info->line = 0;
>>>> - info->column = 0;
>>>> + CreateDWARFContext();
>>>> + getLineInfoFromContext(dwarf_context_, info);
>>>> }
>>>>
>>>> -void ModuleDIContext::CreateDIContext() {
>>>> +void ModuleDIContext::CreateDWARFContext() {
>>>> mapped_addr_ = (uptr)MapFileToMemory(full_name_, &mapped_size_);
>>>> CHECK(mapped_addr_);
>>>> DWARFSection debug_info;
>>>> DWARFSection debug_abbrev;
>>>> - DWARFSection debug_line;
>>>> DWARFSection debug_aranges;
>>>> + DWARFSection debug_line;
>>>> DWARFSection debug_str;
>>>> FindDWARFSection(mapped_addr_, "debug_info", &debug_info);
>>>> FindDWARFSection(mapped_addr_, "debug_abbrev", &debug_abbrev);
>>>> - FindDWARFSection(mapped_addr_, "debug_line", &debug_line);
>>>> FindDWARFSection(mapped_addr_, "debug_aranges", &debug_aranges);
>>>> + FindDWARFSection(mapped_addr_, "debug_line", &debug_line);
>>>> FindDWARFSection(mapped_addr_, "debug_str", &debug_str);
>>>> - // FIXME: Construct actual debug info context using mapped_addr,
>>>> - // mapped_size and pointers to DWARF sections in memory.
>>>> + dwarf_context_ = getDWARFContext(debug_info, debug_abbrev,
>>>> debug_aranges,
>>>> + debug_line, debug_str);
>>>> }
>>>>
>>>> class Symbolizer {
>>>>
>>>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h?rev=161045&r1=161044&r2=161045&view=diff
>>>>
>>>> ==============================================================================
>>>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
>>>> (original)
>>>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h Tue
>>>> Jul 31 06:51:26 2012
>>>> @@ -66,6 +66,14 @@
>>>> DWARFSection *section);
>>>> bool IsFullNameOfDWARFSection(const char *full_name, const char
>>>> *short_name);
>>>>
>>>> +class DWARFContext;
>>>> +DWARFContext *getDWARFContext(DWARFSection debug_info,
>>>> + DWARFSection debug_abbrev,
>>>> + DWARFSection debug_aranges,
>>>> + DWARFSection debug_line,
>>>> + DWARFSection debug_str);
>>>> +void getLineInfoFromContext(DWARFContext *context, AddressInfo *info);
>>>> +
>>>> class ModuleDIContext {
>>>> public:
>>>> ModuleDIContext(const char *module_name, uptr base_address);
>>>> @@ -76,7 +84,7 @@
>>>> const char *full_name() const { return full_name_; }
>>>>
>>>> private:
>>>> - void CreateDIContext();
>>>> + void CreateDWARFContext();
>>>>
>>>> struct AddressRange {
>>>> uptr beg;
>>>> @@ -90,6 +98,7 @@
>>>> uptr n_ranges_;
>>>> uptr mapped_addr_;
>>>> uptr mapped_size_;
>>>> + DWARFContext *dwarf_context_;
>>>> };
>>>>
>>>> // OS-dependent function that gets the linked list of all loaded
>>>> modules.
>>>>
>>>> Added:
>>>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_llvm.cc
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_llvm.cc?rev=161045&view=auto
>>>>
>>>> ==============================================================================
>>>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_llvm.cc
>>>> (added)
>>>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_llvm.cc
>>>> Tue Jul 31 06:51:26 2012
>>>> @@ -0,0 +1,104 @@
>>>> +//===-- sanitizer_symbolizer_llvm.cc
>>>> --------------------------------------===//
>>>> +//
>>>> +// The LLVM Compiler Infrastructure
>>>> +//
>>>> +// This file is distributed under the University of Illinois Open
>>>> Source
>>>> +// License. See LICENSE.TXT for details.
>>>> +//
>>>>
>>>> +//===----------------------------------------------------------------------===//
>>>> +//
>>>> +// This is a wrapper around llvm::DIContext, moved to separate file to
>>>> +// include LLVM headers in a single place in sanitizer library. If
>>>> macro
>>>> +// SANITIZER_USES_LLVM_LIBS is not defined, then sanitizer runtime
>>>> +// will not include LLVM headers and will not require static
>>>> +// LLVM libraries to link with.
>>>> +// In this case, the symbolizer will just return zeroes instead of
>>>> +// valid file/line info.
>>>> +//
>>>> +// This file is shared between AddressSanitizer and ThreadSanitizer
>>>> +// run-time libraries.
>>>>
>>>> +//===----------------------------------------------------------------------===//
>>>> +
>>>> +#include "sanitizer_common.h"
>>>> +#include "sanitizer_symbolizer.h"
>>>> +
>>>> +#ifdef SANITIZER_USES_LLVM_LIBS
>>>> +# ifndef __STDC_LIMIT_MACROS
>>>> +# define __STDC_LIMIT_MACROS 1
>>>> +# endif
>>>> +# ifndef __STDC_CONSTANT_MACROS
>>>> +# define __STDC_CONSTANT_MACROS 1
>>>> +# endif
>>>> +# include "llvm/ADT/StringRef.h"
>>>> +# include "llvm/DebugInfo/DIContext.h"
>>>> +
>>>> +namespace __sanitizer {
>>>> +
>>>> +static llvm::StringRef ToStringRef(const DWARFSection §ion) {
>>>> + return llvm::StringRef(section.data, section.size);
>>>> +}
>>>> +
>>>> +class DWARFContext : public llvm::DIContext {};
>>>> +
>>>> +DWARFContext *getDWARFContext(DWARFSection debug_info,
>>>> + DWARFSection debug_abbrev,
>>>> + DWARFSection debug_aranges,
>>>> + DWARFSection debug_line,
>>>> + DWARFSection debug_str) {
>>>> + return (DWARFContext*)llvm::DIContext::getDWARFContext(
>>>> + true, ToStringRef(debug_info), ToStringRef(debug_abbrev),
>>>> + llvm::StringRef(), // don't use .debug_aranges for now.
>>>> + ToStringRef(debug_line), ToStringRef(debug_str));
>>>> +}
>>>> +
>>>> +void getLineInfoFromContext(DWARFContext *context, AddressInfo *info) {
>>>> + CHECK(context);
>>>> + uint32_t flags = llvm::DILineInfoSpecifier::FileLineInfo |
>>>> + llvm::DILineInfoSpecifier::AbsoluteFilePath |
>>>> + llvm::DILineInfoSpecifier::FunctionName;
>>>> + llvm::DILineInfo line_info = context->getLineInfoForAddress(
>>>> + info->module_offset, flags);
>>>> +
>>>> + const char *function = line_info.getFunctionName();
>>>> + CHECK(function);
>>>> + if (0 != internal_strcmp("<invalid>", function))
>>>> + info->function = internal_strdup(function);
>>>> + else
>>>> + info->function = 0;
>>>> +
>>>> + const char *file = line_info.getFileName();
>>>> + CHECK(file);
>>>> + if (0 != internal_strcmp("<invalid>", file))
>>>> + info->file = internal_strdup(file);
>>>> + else
>>>> + info->file = 0;
>>>> +
>>>> + info->line = line_info.getLine();
>>>> + info->column = line_info.getColumn();
>>>> +}
>>>> +
>>>> +} // namespace __sanitizer
>>>> +
>>>> +#else // SANITIZER_USES_LLVM_LIBS
>>>> +namespace __sanitizer {
>>>> +
>>>> +class DWARFContext {};
>>>> +
>>>> +DWARFContext *getDWARFContext(DWARFSection debug_info,
>>>> + DWARFSection debug_abbrev,
>>>> + DWARFSection debug_aranges,
>>>> + DWARFSection debug_line,
>>>> + DWARFSection debug_str) {
>>>> + return 0;
>>>> +}
>>>> +
>>>> +void getLineInfoFromContext(DWARFContext *context, AddressInfo *info) {
>>>> + (void)context;
>>>> + info->function = 0;
>>>> + info->file = 0;
>>>> + info->line = 0;
>>>> + info->column = 0;
>>>> +}
>>>> +
>>>> +} // namespace __sanitizer
>>>> +#endif // SANITIZER_USES_LLVM_LIBS
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>
>>>
>>
>>
>> --
>> Alexey Samsonov, MSK
>>
>>
>
--
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120814/156d1ee4/attachment.html>
More information about the llvm-commits
mailing list