/* { dg-do compile } */
/* { dg-options "-fno-delete-null-pointer-checks" } */
/* { dg-require-effective-target label_values } */

__extension__ typedef __UINTPTR_TYPE__ uintptr_t;

extern struct module __this_module;
static inline void
trace_module_get  (struct module *mod, uintptr_t ip) { }
struct module;
int module_is_live (struct module *);
static inline __attribute__((no_instrument_function))
int try_module_get(struct module *module)
{
  int ret = 1;
  if (module)
    {
      if (module_is_live(module))
	{
	  __label__ __here;
	  asm("");
	  __here:
	  trace_module_get(module, (uintptr_t)&&__here);
	}
      else
	ret = 0;
    }
  return ret;
}
struct net_device;
struct net_device_ops {
    int (*ndo_open)(struct net_device *dev);
};
int hdlc_open (struct net_device *);
int t3e3_open(struct net_device *dev)
{
  int ret = hdlc_open(dev);
  if (ret)
    return ret;
  try_module_get((&__this_module));
  return 0;
}
const struct net_device_ops t3e3_ops = { .ndo_open = t3e3_open };
