[llvm] r296847 - LiveDebugValues: Assume calls never clobber SP.

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 9 08:17:49 PST 2017


On 03/09/2017 10:13 AM, Adrian Prantl wrote:
>
>> On Mar 9, 2017, at 7:07 AM, Hal Finkel <hfinkel at anl.gov 
>> <mailto:hfinkel at anl.gov>> wrote:
>>
>>
>> On 03/06/2017 04:48 PM, Adrian Prantl via llvm-commits wrote:
>>>
>>>> On Mar 6, 2017, at 2:33 PM, David Blaikie <dblaikie at gmail.com 
>>>> <mailto:dblaikie at gmail.com>> wrote:
>>>>
>>>>
>>>>
>>>> On Thu, Mar 2, 2017 at 5:20 PM Adrian Prantl via llvm-commits 
>>>> <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> 
>>>> wrote:
>>>>
>>>>     Author: adrian
>>>>     Date: Thu Mar  2 19:08:25 2017
>>>>     New Revision: 296847
>>>>
>>>>     URL: http://llvm.org/viewvc/llvm-project?rev=296847&view=rev
>>>>     Log:
>>>>     LiveDebugValues: Assume calls never clobber SP.
>>>>
>>>>     A call should never modify the stack pointer, but some backends are
>>>>     not so sure about this and never list SP in the regmask.
>>>>
>>
>> I don't quite understand this statement. For callee-cleanup calling 
>> conventions (e.g. pascal, stdcall, etc. on Windows), the callee (and, 
>> thus, from the perspective of the caller, the call instruction), does 
>> modify the stack pointer. What am I missing?
>
> That's a good point, thanks. I guess what we really want to know in 
> LiveDebugValues is whether a function call (or rather the combination 
> of instructions pushing the argument and the function call) clobbers 
> any variables that are stored in the caller's frame

What do you mean here by "variables"? Local stack variables can 
certainly be passed to callees and the callees might modify them.

  -Hal

> , and that isn't the case (right?). I should at the very least improve 
> the wording in the comment.
>
> thanks,
> adrian
>
>>
>> Thanks again,
>> Hal
>>
>>>>
>>>> Should the backends be fixed instead?
>>>
>>> Yes they should, but my understanding is that this is a larger 
>>> undertaking that is not likely to happen anytime soon.
>>>
>>> -- adrian
>>>
>>>>     For the
>>>>     purposes of LiveDebugValues we assume a call never clobbers SP. We
>>>>     already have a similar workaround in DbgValueHistoryCalculator
>>>>     (which
>>>>     we hopefully can retire soon).
>>>>
>>>>     This fixes the availabilty of local ASANified variables on AArch64.
>>>>
>>>>     rdar://problem/27757381
>>>>
>>>>     Added:
>>>>     llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.ll
>>>>     Modified:
>>>>     llvm/trunk/lib/CodeGen/LiveDebugValues.cpp
>>>>
>>>>     Modified: llvm/trunk/lib/CodeGen/LiveDebugValues.cpp
>>>>     URL:
>>>>     http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveDebugValues.cpp?rev=296847&r1=296846&r2=296847&view=diff
>>>>     ==============================================================================
>>>>     --- llvm/trunk/lib/CodeGen/LiveDebugValues.cpp (original)
>>>>     +++ llvm/trunk/lib/CodeGen/LiveDebugValues.cpp Thu Mar  2
>>>>     19:08:25 2017
>>>>     @@ -373,8 +373,12 @@ void LiveDebugValues::transferRegisterDe
>>>>        unsigned SP = TLI->getStackPointerRegisterToSaveRestore();
>>>>        SparseBitVector<> KillSet;
>>>>        for (const MachineOperand &MO : MI.operands()) {
>>>>     +    // Determine whether the operand is a register def. 
>>>>     Assume that call
>>>>     +    // instructions never clobber SP, because some backends
>>>>     (e.g., AArch64)
>>>>     +    // never list SP in the regmask.
>>>>          if (MO.isReg() && MO.isDef() && MO.getReg() &&
>>>>     - TRI->isPhysicalRegister(MO.getReg())) {
>>>>     + TRI->isPhysicalRegister(MO.getReg()) &&
>>>>     +        !(MI.isCall() && MO.getReg() == SP)) {
>>>>            // Remove ranges of all aliased registers.
>>>>            for (MCRegAliasIterator RAI(MO.getReg(), TRI, true);
>>>>     RAI.isValid(); ++RAI)
>>>>              for (unsigned ID : OpenRanges.getVarLocs())
>>>>
>>>>     Added: llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.ll
>>>>     URL:
>>>>     http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.ll?rev=296847&view=auto
>>>>     ==============================================================================
>>>>     --- llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.ll (added)
>>>>     +++ llvm/trunk/test/DebugInfo/AArch64/asan-stack-vars.ll Thu
>>>>     Mar  2 19:08:25 2017
>>>>     @@ -0,0 +1,326 @@
>>>>     +; RUN: llc -O0 -filetype=obj -o - %s | llvm-dwarfdump - |
>>>>     FileCheck %s
>>>>     +;
>>>>     +; Derived from (clang -O0 -g -fsanitize=address -fobjc-arc)
>>>>     +;   @protocol NSObject
>>>>     +;   @end
>>>>     +;   @interface NSObject<NSObject>{}
>>>>     +;   + (instancetype)alloc;
>>>>     +;   @end
>>>>     +;   struct CGSize {
>>>>     +;     double width;
>>>>     +;     double height;
>>>>     +;   };
>>>>     +;   typedef struct CGSize CGSize;
>>>>     +;   @interface Object : NSObject
>>>>     +;   - (instancetype)initWithSize:(CGSize)size;
>>>>     +;   - (id)aMessage;
>>>>     +;   @end
>>>>     +;   @implementation MyObject
>>>>     +;   + (id)doWithSize:(CGSize)imageSize andObject:(id)object {
>>>>     +;     return [object aMessage];
>>>>     +;   }
>>>>     +;   @end
>>>>     +;
>>>>     +; CHECK: .debug_info contents:
>>>>     +; CHECK: DW_TAG_subprogram
>>>>     +; CHECK-NEXT:   DW_AT_low_pc [DW_FORM_addr]   
>>>>      (0x0000000000000000)
>>>>     +; CHECK-NEXT:   DW_AT_high_pc [DW_FORM_addr]    ([[FN_END:.*]])
>>>>     +; CHECK: "_cmd"
>>>>     +; CHECK: DW_TAG_formal_parameter
>>>>     +; CHECK-NEXT: DW_AT_location {{.*}} ([[OFS:.*]])
>>>>     +; CHECK-NEXT: DW_AT_name {{.*}}"imageSize"
>>>>     +;
>>>>     +; CHECK: .debug_loc contents:
>>>>     +; CHECK: [[OFS]]: Beginning address offset: 0x0000000000000000
>>>>     +; CHECK_NOT: 0x{{.*}}: Beginning
>>>>     +; CHECK:          Ending address offset: [[FN_END]]
>>>>     +
>>>>     +; ModuleID = 'm.m'
>>>>     +source_filename = "m.m"
>>>>     +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
>>>>     +target triple = "arm64-apple-ios"
>>>>     +
>>>>     +%0 = type opaque
>>>>     +%struct._class_t = type { %struct._class_t*,
>>>>     %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**,
>>>>     %struct._class_ro_t* }
>>>>     +%struct._objc_cache = type opaque
>>>>     +%struct._class_ro_t = type { i32, i32, i32, i8*, i8*,
>>>>     %struct.__method_list_t*, %struct._objc_protocol_list*,
>>>>     %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
>>>>     +%struct.__method_list_t = type { i32, i32, [0 x
>>>>     %struct._objc_method] }
>>>>     +%struct._objc_method = type { i8*, i8*, i8* }
>>>>     +%struct._objc_protocol_list = type { i64, [0 x
>>>>     %struct._protocol_t*] }
>>>>     +%struct._protocol_t = type { i8*, i8*,
>>>>     %struct._objc_protocol_list*, %struct.__method_list_t*,
>>>>     %struct.__method_list_t*, %struct.__method_list_t*,
>>>>     %struct.__method_list_t*, %struct._prop_list_t*, i32, i32,
>>>>     i8**, i8*, %struct._prop_list_t* }
>>>>     +%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
>>>>     +%struct._ivar_t = type { i32*, i8*, i8*, i32, i32 }
>>>>     +%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] }
>>>>     +%struct._prop_t = type { i8*, i8* }
>>>>     +%struct.CGSize = type { double, double }
>>>>     +
>>>>     +@"OBJC_CLASS_$_Object" = external global %struct._class_t
>>>>     +@"OBJC_CLASSLIST_REFERENCES_$_" = private global
>>>>     %struct._class_t* @"OBJC_CLASS_$_Object", section "__DATA,
>>>>     __objc_classrefs, regular, no_dead_strip", align 8
>>>>     + at OBJC_METH_VAR_NAME_ = private unnamed_addr constant [6 x i8]
>>>>     c"alloc\00", section "__TEXT,__objc_methname,cstring_literals",
>>>>     align 1
>>>>     + at OBJC_SELECTOR_REFERENCES_ = private externally_initialized
>>>>     global i8* getelementptr inbounds ([6 x i8], [6 x i8]*
>>>>     @OBJC_METH_VAR_NAME_, i32 0, i32 0), section "__DATA,
>>>>     __objc_selrefs, literal_pointers, no_dead_strip", align 8
>>>>     + at OBJC_METH_VAR_NAME_.1 = private unnamed_addr constant [14 x
>>>>     i8] c"initWithSize:\00", section
>>>>     "__TEXT,__objc_methname,cstring_literals", align 1
>>>>     + at OBJC_SELECTOR_REFERENCES_.2 = private externally_initialized
>>>>     global i8* getelementptr inbounds ([14 x i8], [14 x i8]*
>>>>     @OBJC_METH_VAR_NAME_.1, i32 0, i32 0), section "__DATA,
>>>>     __objc_selrefs, literal_pointers, no_dead_strip", align 8
>>>>     + at OBJC_METH_VAR_NAME_.3 = private unnamed_addr constant [9 x
>>>>     i8] c"aMessage\00", section
>>>>     "__TEXT,__objc_methname,cstring_literals", align 1
>>>>     + at OBJC_SELECTOR_REFERENCES_.4 = private externally_initialized
>>>>     global i8* getelementptr inbounds ([9 x i8], [9 x i8]*
>>>>     @OBJC_METH_VAR_NAME_.3, i32 0, i32 0), section "__DATA,
>>>>     __objc_selrefs, literal_pointers, no_dead_strip", align 8
>>>>     + at _objc_empty_cache = external global %struct._objc_cache
>>>>     +@"OBJC_CLASS_$_MyObject" = global %struct._class_t {
>>>>     %struct._class_t* @"OBJC_METACLASS_$_MyObject",
>>>>     %struct._class_t* null, %struct._objc_cache*
>>>>     @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t*
>>>>     @"\01l_OBJC_CLASS_RO_$_MyObject" }, section "__DATA,
>>>>     __objc_data", align 8
>>>>     +@"OBJC_METACLASS_$_MyObject" = global %struct._class_t {
>>>>     %struct._class_t* @"OBJC_METACLASS_$_MyObject",
>>>>     %struct._class_t* @"OBJC_CLASS_$_MyObject",
>>>>     %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null,
>>>>     %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_MyObject" },
>>>>     section "__DATA, __objc_data", align 8
>>>>     + at OBJC_CLASS_NAME_ = private unnamed_addr constant [9 x i8]
>>>>     c"MyObject\00", section
>>>>     "__TEXT,__objc_classname,cstring_literals", align 1
>>>>     + at OBJC_METH_VAR_NAME_.5 = private unnamed_addr constant [12 x
>>>>     i8] c"doWithSize:\00", section
>>>>     "__TEXT,__objc_methname,cstring_literals", align 1
>>>>     + at OBJC_METH_VAR_TYPE_ = private unnamed_addr constant [21 x i8]
>>>>     c"@32 at 0:8{CGSize=dd}16\00", section
>>>>     "__TEXT,__objc_methtype,cstring_literals", align 1
>>>>     +@"\01l_OBJC_$_CLASS_METHODS_MyObject" = private global { i32,
>>>>     i32, [1 x %struct._objc_method] } { i32 24, i32 1, [1 x
>>>>     %struct._objc_method] [%struct._objc_method { i8* getelementptr
>>>>     inbounds ([12 x i8], [12 x i8]* @OBJC_METH_VAR_NAME_.5, i32 0,
>>>>     i32 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]*
>>>>     @OBJC_METH_VAR_TYPE_, i32 0, i32 0), i8* bitcast (i8* (i8*,
>>>>     i8*, [2 x double])* @"\01+[MyObject doWithSize:]" to i8*) }] },
>>>>     section "__DATA, __objc_const", align 8
>>>>     +@"\01l_OBJC_METACLASS_RO_$_MyObject" = private global
>>>>     %struct._class_ro_t { i32 131, i32 40, i32 40, i8* null, i8*
>>>>     getelementptr inbounds ([9 x i8], [9 x i8]* @OBJC_CLASS_NAME_,
>>>>     i32 0, i32 0), %struct.__method_list_t* bitcast ({ i32, i32, [1
>>>>     x %struct._objc_method] }*
>>>>     @"\01l_OBJC_$_CLASS_METHODS_MyObject" to
>>>>     %struct.__method_list_t*), %struct._objc_protocol_list* null,
>>>>     %struct._ivar_list_t* null, i8* null, %struct._prop_list_t*
>>>>     null }, section "__DATA, __objc_const", align 8
>>>>     +@"\01l_OBJC_CLASS_RO_$_MyObject" = private global
>>>>     %struct._class_ro_t { i32 130, i32 0, i32 0, i8* null, i8*
>>>>     getelementptr inbounds ([9 x i8], [9 x i8]* @OBJC_CLASS_NAME_,
>>>>     i32 0, i32 0), %struct.__method_list_t* null,
>>>>     %struct._objc_protocol_list* null, %struct._ivar_list_t* null,
>>>>     i8* null, %struct._prop_list_t* null }, section "__DATA,
>>>>     __objc_const", align 8
>>>>     +@"OBJC_LABEL_CLASS_$" = private global [1 x i8*] [i8* bitcast
>>>>     (%struct._class_t* @"OBJC_CLASS_$_MyObject" to i8*)], section
>>>>     "__DATA, __objc_classlist, regular, no_dead_strip", align 8
>>>>     + at llvm.compiler.used = appending global [12 x i8*] [i8* bitcast
>>>>     (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8*),
>>>>     i8* getelementptr inbounds ([6 x i8], [6 x i8]*
>>>>     @OBJC_METH_VAR_NAME_, i32 0, i32 0), i8* bitcast (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_ to i8*), i8* getelementptr inbounds
>>>>     ([14 x i8], [14 x i8]* @OBJC_METH_VAR_NAME_.1, i32 0, i32 0),
>>>>     i8* bitcast (i8** @OBJC_SELECTOR_REFERENCES_.2 to i8*), i8*
>>>>     getelementptr inbounds ([9 x i8], [9 x i8]*
>>>>     @OBJC_METH_VAR_NAME_.3, i32 0, i32 0), i8* bitcast (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_.4 to i8*), i8* getelementptr
>>>>     inbounds ([9 x i8], [9 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0),
>>>>     i8* getelementptr inbounds ([12 x i8], [12 x i8]*
>>>>     @OBJC_METH_VAR_NAME_.5, i32 0, i32 0), i8* getelementptr
>>>>     inbounds ([21 x i8], [21 x i8]* @OBJC_METH_VAR_TYPE_, i32 0,
>>>>     i32 0), i8* bitcast ({ i32, i32, [1 x %struct._objc_method] }*
>>>>     @"\01l_OBJC_$_CLASS_METHODS_MyObject" to i8*), i8* bitcast ([1
>>>>     x i8*]* @"OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata"
>>>>     + at llvm.global_ctors = appending global [1 x { i32, void ()*,
>>>>     i8* }] [{ i32, void ()*, i8* } { i32 1, void ()*
>>>>     @asan.module_ctor, i8* null }]
>>>>     + at __asan_shadow_memory_dynamic_address = external global i64
>>>>     + at __asan_gen_ = private unnamed_addr constant [34 x i8] c"2 32
>>>>     16 9 imageSize 64 8 6 object\00", align 1
>>>>     +
>>>>     +; Function Attrs: noinline sanitize_address ssp uwtable
>>>>     +define internal i8* @"\01+[MyObject doWithSize:]"(i8* %self,
>>>>     i8* %_cmd, [2 x double] %imageSize.coerce) #0 !dbg !14 {
>>>>     +entry:
>>>>     +  %0 = load i64, i64* @__asan_shadow_memory_dynamic_address
>>>>     +  %self.addr = alloca i8*, align 8
>>>>     +  %_cmd.addr = alloca i8*, align 8
>>>>     +  %MyAlloca = alloca [96 x i8], align 32, !dbg !35
>>>>     +  %1 = ptrtoint [96 x i8]* %MyAlloca to i64, !dbg !35
>>>>     +  %2 = add i64 %1, 32, !dbg !35
>>>>     +  %3 = inttoptr i64 %2 to %struct.CGSize*, !dbg !35
>>>>     +  %4 = add i64 %1, 64, !dbg !35
>>>>     +  %5 = inttoptr i64 %4 to %0**, !dbg !35
>>>>     +  %6 = inttoptr i64 %1 to i64*, !dbg !35
>>>>     +  store i64 1102416563, i64* %6, !dbg !35
>>>>     +  %7 = add i64 %1, 8, !dbg !35
>>>>     +  %8 = inttoptr i64 %7 to i64*, !dbg !35
>>>>     +  store i64 ptrtoint ([34 x i8]* @__asan_gen_ to i64), i64*
>>>>     %8, !dbg !35
>>>>     +  %9 = add i64 %1, 16, !dbg !35
>>>>     +  %10 = inttoptr i64 %9 to i64*, !dbg !35
>>>>     +  store i64 ptrtoint (i8* (i8*, i8*, [2 x double])*
>>>>     @"\01+[MyObject doWithSize:]" to i64), i64* %10, !dbg !35
>>>>     +  %11 = lshr i64 %1, 3, !dbg !35
>>>>     +  %12 = add i64 %11, %0, !dbg !35
>>>>     +  %13 = add i64 %12, 0, !dbg !35
>>>>     +  %14 = inttoptr i64 %13 to i64*, !dbg !35
>>>>     +  store i64 -940689368107847183, i64* %14, align 1, !dbg !35
>>>>     +  %15 = add i64 %12, 9, !dbg !35
>>>>     +  %16 = inttoptr i64 %15 to i16*, !dbg !35
>>>>     +  store i16 -3085, i16* %16, align 1, !dbg !35
>>>>     +  %17 = add i64 %12, 11, !dbg !35
>>>>     +  %18 = inttoptr i64 %17 to i8*, !dbg !35
>>>>     +  store i8 -13, i8* %18, align 1, !dbg !35
>>>>     +  call void @llvm.dbg.declare(metadata %struct.CGSize* %3,
>>>>     metadata !36, metadata !37), !dbg !38
>>>>     +  call void @llvm.dbg.declare(metadata %0** %5, metadata !39,
>>>>     metadata !37), !dbg !45
>>>>     +  %19 = bitcast %struct.CGSize* %3 to [2 x double]*
>>>>     +  %20 = ptrtoint [2 x double]* %19 to i64
>>>>     +  %21 = lshr i64 %20, 3
>>>>     +  %22 = add i64 %21, %0
>>>>     +  %23 = inttoptr i64 %22 to i16*
>>>>     +  %24 = load i16, i16* %23
>>>>     +  %25 = icmp ne i16 %24, 0
>>>>     +  br i1 %25, label %26, label %27
>>>>     +
>>>>     +; <label>:26:              ; preds = %entry
>>>>     +  call void @__asan_report_store16(i64 %20)
>>>>     +  call void asm sideeffect "", ""()
>>>>     +  unreachable
>>>>     +
>>>>     +; <label>:27:              ; preds = %entry
>>>>     +  store [2 x double] %imageSize.coerce, [2 x double]* %19, align 8
>>>>     +  store i8* %self, i8** %self.addr, align 8
>>>>     +  call void @llvm.dbg.declare(metadata i8** %self.addr,
>>>>     metadata !46, metadata !48), !dbg !49
>>>>     +  store i8* %_cmd, i8** %_cmd.addr, align 8
>>>>     +  call void @llvm.dbg.declare(metadata i8** %_cmd.addr,
>>>>     metadata !50, metadata !48), !dbg !49
>>>>     +  %28 = load %struct._class_t*, %struct._class_t**
>>>>     @"OBJC_CLASSLIST_REFERENCES_$_", align 8, !dbg !52
>>>>     +  %29 = add i64 lshr (i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_ to i64), i64 3), %0, !dbg !52
>>>>     +  %30 = inttoptr i64 %29 to i8*, !dbg !52
>>>>     +  %31 = load i8, i8* %30, !dbg !52
>>>>     +  %32 = icmp ne i8 %31, 0, !dbg !52
>>>>     +  br i1 %32, label %33, label %34, !dbg !52
>>>>     +
>>>>     +; <label>:33:              ; preds = %27
>>>>     +  call void @__asan_report_load8(i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_ to i64)), !dbg !52
>>>>     +  call void asm sideeffect "", ""(), !dbg !52
>>>>     +  unreachable, !dbg !52
>>>>     +
>>>>     +; <label>:34:              ; preds = %27
>>>>     +  %35 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8,
>>>>     !dbg !52, !invariant.load !2
>>>>     +  %36 = bitcast %struct._class_t* %28 to i8*, !dbg !52
>>>>     +  %call = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
>>>>     to i8* (i8*, i8*)*)(i8* %36, i8* %35), !dbg !52
>>>>     +  %37 = bitcast i8* %call to %0*, !dbg !52
>>>>     +  %38 = add i64 lshr (i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_.2 to i64), i64 3), %0, !dbg !53
>>>>     +  %39 = inttoptr i64 %38 to i8*, !dbg !53
>>>>     +  %40 = load i8, i8* %39, !dbg !53
>>>>     +  %41 = icmp ne i8 %40, 0, !dbg !53
>>>>     +  br i1 %41, label %42, label %43, !dbg !53
>>>>     +
>>>>     +; <label>:42:              ; preds = %34
>>>>     +  call void @__asan_report_load8(i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_.2 to i64)), !dbg !53
>>>>     +  call void asm sideeffect "", ""(), !dbg !53
>>>>     +  unreachable, !dbg !53
>>>>     +
>>>>     +; <label>:43:              ; preds = %34
>>>>     +  %44 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.2, align 8,
>>>>     !dbg !53, !invariant.load !2
>>>>     +  %45 = bitcast %0* %37 to i8*, !dbg !53
>>>>     +  %46 = bitcast %struct.CGSize* %3 to [2 x double]*, !dbg !53
>>>>     +  %47 = ptrtoint [2 x double]* %46 to i64, !dbg !53
>>>>     +  %48 = lshr i64 %47, 3, !dbg !53
>>>>     +  %49 = add i64 %48, %0, !dbg !53
>>>>     +  %50 = inttoptr i64 %49 to i16*, !dbg !53
>>>>     +  %51 = load i16, i16* %50, !dbg !53
>>>>     +  %52 = icmp ne i16 %51, 0, !dbg !53
>>>>     +  br i1 %52, label %53, label %54, !dbg !53
>>>>     +
>>>>     +; <label>:53:              ; preds = %43
>>>>     +  call void @__asan_report_load16(i64 %47), !dbg !53
>>>>     +  call void asm sideeffect "", ""(), !dbg !53
>>>>     +  unreachable, !dbg !53
>>>>     +
>>>>     +; <label>:54:              ; preds = %43
>>>>     +  %55 = load [2 x double], [2 x double]* %46, align 8, !dbg !53
>>>>     +  %call1 = call i8* bitcast (i8* (i8*, i8*, ...)*
>>>>     @objc_msgSend to i8* (i8*, i8*, [2 x double])*)(i8* %45, i8*
>>>>     %44, [2 x double] %55), !dbg !53
>>>>     +  %56 = bitcast i8* %call1 to %0*, !dbg !53
>>>>     +  %57 = ptrtoint %0** %5 to i64, !dbg !45
>>>>     +  %58 = lshr i64 %57, 3, !dbg !45
>>>>     +  %59 = add i64 %58, %0, !dbg !45
>>>>     +  %60 = inttoptr i64 %59 to i8*, !dbg !45
>>>>     +  %61 = load i8, i8* %60, !dbg !45
>>>>     +  %62 = icmp ne i8 %61, 0, !dbg !45
>>>>     +  br i1 %62, label %63, label %64, !dbg !45
>>>>     +
>>>>     +; <label>:63:              ; preds = %54
>>>>     +  call void @__asan_report_store8(i64 %57), !dbg !45
>>>>     +  call void asm sideeffect "", ""(), !dbg !45
>>>>     +  unreachable, !dbg !45
>>>>     +
>>>>     +; <label>:64:              ; preds = %54
>>>>     +  store %0* %56, %0** %5, align 8, !dbg !45
>>>>     +  %65 = load %0*, %0** %5, align 8, !dbg !54
>>>>     +  %66 = add i64 lshr (i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_.4 to i64), i64 3), %0, !dbg !55
>>>>     +  %67 = inttoptr i64 %66 to i8*, !dbg !55
>>>>     +  %68 = load i8, i8* %67, !dbg !55
>>>>     +  %69 = icmp ne i8 %68, 0, !dbg !55
>>>>     +  br i1 %69, label %70, label %71, !dbg !55
>>>>     +
>>>>     +; <label>:70:              ; preds = %64
>>>>     +  call void @__asan_report_load8(i64 ptrtoint (i8**
>>>>     @OBJC_SELECTOR_REFERENCES_.4 to i64)), !dbg !55
>>>>     +  call void asm sideeffect "", ""(), !dbg !55
>>>>     +  unreachable, !dbg !55
>>>>     +
>>>>     +; <label>:71:              ; preds = %64
>>>>     +  %72 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.4, align 8,
>>>>     !dbg !55, !invariant.load !2
>>>>     +  %73 = bitcast %0* %65 to i8*, !dbg !55
>>>>     +  %call2 = call i8* bitcast (i8* (i8*, i8*, ...)*
>>>>     @objc_msgSend to i8* (i8*, i8*)*)(i8* %73, i8* %72), !dbg !55
>>>>     +  call void asm sideeffect "mov\09fp, fp\09\09# marker for
>>>>     objc_retainAutoreleaseReturnValue", ""(), !dbg !55
>>>>     +  %74 = call i8* @objc_retainAutoreleasedReturnValue(i8*
>>>>     %call2) #3, !dbg !55
>>>>     +  %75 = bitcast %0** %5 to i8**, !dbg !56
>>>>     +  call void @objc_storeStrong(i8** %75, i8* null) #3, !dbg !56
>>>>     +  %76 = tail call i8* @objc_autoreleaseReturnValue(i8* %74)
>>>>     #3, !dbg !56
>>>>     +  store i64 1172321806, i64* %6, !dbg !56
>>>>     +  %77 = add i64 %12, 0, !dbg !56
>>>>     +  %78 = inttoptr i64 %77 to i64*, !dbg !56
>>>>     +  store i64 0, i64* %78, align 1, !dbg !56
>>>>     +  %79 = add i64 %12, 9, !dbg !56
>>>>     +  %80 = inttoptr i64 %79 to i16*, !dbg !56
>>>>     +  store i16 0, i16* %80, align 1, !dbg !56
>>>>     +  %81 = add i64 %12, 11, !dbg !56
>>>>     +  %82 = inttoptr i64 %81 to i8*, !dbg !56
>>>>     +  store i8 0, i8* %82, align 1, !dbg !56
>>>>     +  ret i8* %76, !dbg !56
>>>>     +}
>>>>     +
>>>>     +; Function Attrs: nounwind readnone
>>>>     +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
>>>>     +
>>>>     +; Function Attrs: nonlazybind
>>>>     +declare i8* @objc_msgSend(i8*, i8*, ...) #2
>>>>     +
>>>>     +declare i8* @objc_retainAutoreleasedReturnValue(i8* returned)
>>>>     +
>>>>     +declare void @objc_storeStrong(i8**, i8*)
>>>>     +
>>>>     +declare i8* @objc_autoreleaseReturnValue(i8* returned)
>>>>     +
>>>>     +define internal void @asan.module_ctor() {
>>>>     +  call void @__asan_init()
>>>>     +  call void @__asan_version_mismatch_check_v8()
>>>>     +  ret void
>>>>     +}
>>>>     +
>>>>     +declare void @__asan_init()
>>>>     +
>>>>     +declare void @__asan_version_mismatch_check_v8()
>>>>     +
>>>>     +declare void @__asan_report_load8(i64)
>>>>     +
>>>>     +declare void @__asan_report_load16(i64)
>>>>     +
>>>>     +declare void @__asan_report_store8(i64)
>>>>     +
>>>>     +declare void @__asan_report_store16(i64)
>>>>     +
>>>>     +attributes #0 = { noinline sanitize_address ssp uwtable }
>>>>     +attributes #1 = { nounwind readnone }
>>>>     +attributes #2 = { nonlazybind }
>>>>     +attributes #3 = { nounwind }
>>>>     +
>>>>     +!llvm.dbg.cu <http://llvm.dbg.cu/> = !{!0}
>>>>     +!llvm.module.flags = !{!5, !6, !7, !8, !9, !10, !11, !12}
>>>>     +!llvm.ident = !{!13}
>>>>     +
>>>>     +!0 = distinct !DICompileUnit(language: DW_LANG_ObjC, file: !1,
>>>>     producer: "clang version 5.0.0 (trunk 295779) (llvm/trunk
>>>>     295777)", isOptimized: false, runtimeVersion: 2, emissionKind:
>>>>     FullDebug, enums: !2, retainedTypes: !3)
>>>>     +!1 = !DIFile(filename: "m.m", directory: "/")
>>>>     +!2 = !{}
>>>>     +!3 = !{!4}
>>>>     +!4 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "MyObject", scope: !1, file: !1, line: 15, flags:
>>>>     DIFlagObjcClassComplete, elements: !2, runtimeLang: DW_LANG_ObjC)
>>>>     +!5 = !{i32 1, !"Objective-C Version", i32 2}
>>>>     +!6 = !{i32 1, !"Objective-C Image Info Version", i32 0}
>>>>     +!7 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,
>>>>     __objc_imageinfo, regular, no_dead_strip"}
>>>>     +!8 = !{i32 4, !"Objective-C Garbage Collection", i32 0}
>>>>     +!9 = !{i32 1, !"Objective-C Class Properties", i32 64}
>>>>     +!10 = !{i32 2, !"Dwarf Version", i32 2}
>>>>     +!11 = !{i32 2, !"Debug Info Version", i32 3}
>>>>     +!12 = !{i32 1, !"PIC Level", i32 2}
>>>>     +!13 = !{!"clang version 5.0.0 (trunk 295779) (llvm/trunk 295777)"}
>>>>     +!14 = distinct !DISubprogram(name: "+[MyObject doWithSize:]",
>>>>     scope: !1, file: !1, line: 16, type: !15, isLocal: true,
>>>>     isDefinition: true, scopeLine: 16, flags: DIFlagPrototyped,
>>>>     isOptimized: false, unit: !0, variables: !2)
>>>>     +!15 = !DISubroutineType(types: !16)
>>>>     +!16 = !{!17, !24, !26, !29}
>>>>     +!17 = !DIDerivedType(tag: DW_TAG_typedef, name: "id", file:
>>>>     !1, baseType: !18)
>>>>     +!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19,
>>>>     size: 64)
>>>>     +!19 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "objc_object", file: !1, elements: !20)
>>>>     +!20 = !{!21}
>>>>     +!21 = !DIDerivedType(tag: DW_TAG_member, name: "isa", scope:
>>>>     !19, file: !1, baseType: !22, size: 64)
>>>>     +!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !23,
>>>>     size: 64)
>>>>     +!23 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "objc_class", file: !1, flags: DIFlagFwdDecl)
>>>>     +!24 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !25,
>>>>     flags: DIFlagArtificial | DIFlagObjectPointer)
>>>>     +!25 = !DIDerivedType(tag: DW_TAG_typedef, name: "Class", file:
>>>>     !1, baseType: !22)
>>>>     +!26 = !DIDerivedType(tag: DW_TAG_typedef, name: "SEL", file:
>>>>     !1, baseType: !27, flags: DIFlagArtificial)
>>>>     +!27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28,
>>>>     size: 64)
>>>>     +!28 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "objc_selector", file: !1, flags: DIFlagFwdDecl)
>>>>     +!29 = !DIDerivedType(tag: DW_TAG_typedef, name: "CGSize",
>>>>     file: !1, line: 10, baseType: !30)
>>>>     +!30 = distinct !DICompositeType(tag: DW_TAG_structure_type,
>>>>     name: "CGSize", file: !1, line: 6, size: 128, elements: !31)
>>>>     +!31 = !{!32, !34}
>>>>     +!32 = !DIDerivedType(tag: DW_TAG_member, name: "width", scope:
>>>>     !30, file: !1, line: 7, baseType: !33, size: 64)
>>>>     +!33 = !DIBasicType(name: "double", size: 64, encoding:
>>>>     DW_ATE_float)
>>>>     +!34 = !DIDerivedType(tag: DW_TAG_member, name: "height",
>>>>     scope: !30, file: !1, line: 8, baseType: !33, size: 64, offset: 64)
>>>>     +!35 = !DILocation(line: 16, scope: !14)
>>>>     +!36 = !DILocalVariable(name: "imageSize", arg: 3, scope: !14,
>>>>     file: !1, line: 16, type: !29)
>>>>     +!37 = !DIExpression(DW_OP_deref)
>>>>     +!38 = !DILocation(line: 16, column: 26, scope: !14)
>>>>     +!39 = !DILocalVariable(name: "object", scope: !14, file: !1,
>>>>     line: 17, type: !40)
>>>>     +!40 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !41,
>>>>     size: 64)
>>>>     +!41 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "Object", scope: !1, file: !1, line: 11, elements: !42,
>>>>     runtimeLang: DW_LANG_ObjC)
>>>>     +!42 = !{!43}
>>>>     +!43 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !41,
>>>>     baseType: !44)
>>>>     +!44 = !DICompositeType(tag: DW_TAG_structure_type, name:
>>>>     "NSObject", scope: !1, file: !1, line: 3, elements: !2,
>>>>     runtimeLang: DW_LANG_ObjC)
>>>>     +!45 = !DILocation(line: 17, column: 11, scope: !14)
>>>>     +!46 = !DILocalVariable(name: "self", arg: 1, scope: !14, type:
>>>>     !47, flags: DIFlagArtificial | DIFlagObjectPointer)
>>>>     +!47 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !25)
>>>>     +!48 = !DIExpression()
>>>>     +!49 = !DILocation(line: 0, scope: !14)
>>>>     +!50 = !DILocalVariable(name: "_cmd", arg: 2, scope: !14, type:
>>>>     !51, flags: DIFlagArtificial)
>>>>     +!51 = !DIDerivedType(tag: DW_TAG_typedef, name: "SEL", file:
>>>>     !1, baseType: !27)
>>>>     +!52 = !DILocation(line: 17, column: 21, scope: !14)
>>>>     +!53 = !DILocation(line: 17, column: 20, scope: !14)
>>>>     +!54 = !DILocation(line: 18, column: 11, scope: !14)
>>>>     +!55 = !DILocation(line: 18, column: 10, scope: !14)
>>>>     +!56 = !DILocation(line: 19, column: 1, scope: !14)
>>>>
>>>>
>>>>     _______________________________________________
>>>>     llvm-commits mailing list
>>>>     llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>>>>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>> -- 
>> Hal Finkel
>> Lead, Compiler Technology and Programming Languages
>> Leadership Computing Facility
>> Argonne National Laboratory
>

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170309/fa5e239d/attachment-0001.html>


More information about the llvm-commits mailing list