File: funcptr_harvard_gh4432.d

package info (click to toggle)
ldc 1%3A1.40.0-5
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 63,308 kB
  • sloc: cpp: 85,368; ansic: 21,877; makefile: 1,705; sh: 1,018; asm: 584; objc: 135; exp: 48; python: 12
file content (37 lines) | stat: -rw-r--r-- 1,139 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Tests function pointers/delegates on a Harvard architecture,
// with code residing in a separate address space.

// REQUIRES: target_AVR
// RUN: %ldc -mtriple=avr -betterC -output-ll -of=%t.ll %s && FileCheck %s < %t.ll
// RUN: %ldc -mtriple=avr -betterC -c %s

alias FP = void function();
alias DG = void delegate();

// CHECK: @_D22funcptr_harvard_gh44328globalFPPFZv = global ptr addrspace(1) @_D22funcptr_harvard_gh44323barFZv, align 2
__gshared FP globalFP = &bar;
// CHECK: @_D22funcptr_harvard_gh443217globalDataPointerPPFZv = global ptr @_D22funcptr_harvard_gh44328globalFPPFZv, align 2
__gshared FP* globalDataPointer = &globalFP;

// CHECK: define void @_D22funcptr_harvard_gh44323fooFPFZvDQeZv({{.*}} addrspace(1){{\*?}} %fp_arg, { {{.*}} addrspace(1){{\*?}} } %dg_arg) addrspace(1)
void foo(FP fp, DG dg)
{
    // CHECK: call addrspace(1) void %1()
    fp();
    // CHECK: call addrspace(1) void %.funcptr
    dg();
    // CHECK-NEXT: ret void
}

void bar()
{
    foo(() {}, delegate() {});

    FP fp = &bar;
    DG dg;
    dg.funcptr = &bar;
    foo(fp, dg);

    dg.funcptr = *globalDataPointer;
    foo(globalFP, dg);
}