| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "test.h" |
| |
| #define __init __attribute__((__section__(".init.text"))) |
| #define __initdata __attribute__((__section__(".init.data"))) |
| #define __ro_after_init __attribute__((__section__(".data..ro_after_init"))) |
| |
| struct testtype_B_NK { |
| struct testtype_B_NK *next; |
| struct list_head head; |
| int d; |
| char e; |
| char *f; |
| }; |
| |
| struct testtype_C_OK { |
| int a; |
| char b; |
| }; |
| |
| struct testtype_D_OK { |
| struct testtype_D_OK **ptr2ptr; |
| }; |
| |
| struct mutex { |
| int val; |
| struct list_head wait_list; |
| }; |
| |
| struct testtype_E_NK { |
| struct mutex mutexobj; |
| }; |
| |
| struct rb_node { |
| struct rb_node *left, *right; |
| }; |
| |
| struct rb_root { |
| struct rb_node *rb_node; |
| }; |
| |
| struct testtype_F_NK { |
| struct rb_node blah; |
| }; |
| |
| struct testtype_FF_NK { |
| struct rb_root *root; |
| }; |
| |
| typedef struct { |
| int counter; |
| } atomic_t; |
| |
| typedef struct refcount_struct { |
| atomic_t refs; |
| } refcount_t; |
| |
| struct testtype_G_NK { |
| refcount_t refcount; |
| }; |
| |
| struct testtype_G2_NK { |
| struct refcount_struct refstr; |
| }; |
| |
| struct testtype_H_OK { |
| int a; |
| int b; |
| char c; |
| }; |
| |
| struct testtype_I_OK { |
| int a; |
| int b; |
| char c; |
| }; |
| |
| typedef unsigned long resource_size_t; |
| struct resource { |
| resource_size_t start; |
| resource_size_t end; |
| const char *name; |
| unsigned long flags; |
| unsigned long desc; |
| struct resource *parent, *sibling, *child; |
| }; |
| |
| static struct testtype_A_NK global_objA; |
| static struct list_head global_listhead; |
| static struct testtype_A_NK global_objA2; |
| static struct testtype_B_NK global_objB; |
| static struct testtype_C_OK global_objC; |
| static struct testtype_C_OK global_ns_objC; |
| static struct testtype_D_OK global_objD; |
| static struct mutex global_mutexobj; |
| static struct testtype_E_NK global_objE; |
| static struct testtype_F_NK global_objF; |
| static struct testtype_FF_NK global_objFF; |
| static refcount_t global_refcountt; |
| static struct refcount_struct global_objref; |
| static struct testtype_G_NK global_objG; |
| static struct testtype_G2_NK global_objG2; |
| struct testtype_G2_NK global_objG22; |
| struct testtype_H_OK global_objH; |
| struct testtype_I_OK global_objI __initdata; |
| struct testtype_I_OK global_objII __ro_after_init; |
| static struct resource resource_obj; |
| |
| void __init blah(void) |
| { |
| global_ns_objC.a = 123; |
| global_ns_objC.b = 'c'; |
| |
| global_objH.a = 234; |
| global_objH.b = 345; |
| global_objH.c = 'z'; |
| |
| global_objI.a = 123; |
| global_objI.b = 456; |
| global_objI.c = 'a'; |
| |
| global_objII.a = 123; |
| global_objII.b = 456; |
| global_objII.c = 'a'; |
| } |
| |
| int main(int argc, const char *argv[]) |
| { |
| struct testtype_B_NK obj_b = { |
| .d = 10, |
| .e = 'b', |
| .f = (void *)0, |
| }; |
| struct testtype_A_NK obj_a = { |
| .a = 11, |
| .b = 'a', |
| }; |
| |
| global_ns_objC.a = 567; |
| global_ns_objC.b = 'd'; |
| |
| return 0; |
| } |