[llvm] r296847 - LiveDebugValues: Assume calls never clobber SP.
Hal Finkel via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 9 07:07:49 PST 2017
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?
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170309/a5dee312/attachment.html>
More information about the llvm-commits
mailing list