2002-12-28 03:45:01

by Rusty Russell

[permalink] [raw]
Subject: [PATCH] Mark deprecated functions so they give a warning on use

If anyone can think of a better way, please share. This should speed
up the removal of functions like check_region() (which, despite
William's janitorial efforts, is still not at the stage where it can
be removed).

Thanks,
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

Name: Mark deprecated functions so they give a warning on use
Author: Rusty Russell
Status: Trivial

D: Should speed elimination of deprecated functions (eg. check_region,
D: deprecated since 2.3, still used in about 120 files).
D:
D: This patch causes an "unused label" warning: hopefully unusual
D: enough to make people look twice. eg:
D: drivers/net/depca.c: In function `isa_probe':
D: drivers/net/depca.c:1413: warning: label `DEPRECATED_use_request_region_return_value' defined but not used

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.53/include/linux/compiler.h working-2.5.53-deprecated/include/linux/compiler.h
--- linux-2.5.53/include/linux/compiler.h 2002-12-28 11:12:34.000000000 +1100
+++ working-2.5.53-deprecated/include/linux/compiler.h 2002-12-28 11:51:08.000000000 +1100
@@ -19,4 +19,10 @@
({ unsigned long __ptr; \
__asm__ ("" : "=g"(__ptr) : "0"(ptr)); \
(typeof(ptr)) (__ptr + (off)); })
+
+/* Used to give a warning on use of deprecated functions. eg:
+ #define some_old_function(arg) \
+ __DEPRECATED(use_newfunction_instead), __some_old_function(arg)
+*/
+#define __DEPRECATED(msg) ({DEPRECATED_##msg: 1; })
#endif /* __LINUX_COMPILER_H */
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.5.53/include/linux/ioport.h working-2.5.53-deprecated/include/linux/ioport.h
--- linux-2.5.53/include/linux/ioport.h 2002-10-31 12:37:01.000000000 +1100
+++ working-2.5.53-deprecated/include/linux/ioport.h 2002-12-28 11:51:46.000000000 +1100
@@ -7,6 +7,7 @@

#ifndef _LINUX_IOPORT_H
#define _LINUX_IOPORT_H
+#include <linux/compiler.h>

/*
* Resources are tree-like, allowing
@@ -102,7 +103,7 @@ extern int allocate_resource(struct reso
extern struct resource * __request_region(struct resource *, unsigned long start, unsigned long n, const char *name);

/* Compatibility cruft */
-#define check_region(start,n) __check_region(&ioport_resource, (start), (n))
+#define check_region(start,n) __DEPRECATED(use_request_region_return_value), __check_region(&ioport_resource, (start), (n))
#define release_region(start,n) __release_region(&ioport_resource, (start), (n))
#define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n))
#define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))


2002-12-28 05:46:14

by Richard Henderson

[permalink] [raw]
Subject: Re: [PATCH] Mark deprecated functions so they give a warning on use

On Sat, Dec 28, 2002 at 11:57:10AM +1100, Rusty Russell wrote:
> +#define __DEPRECATED(msg) ({DEPRECATED_##msg: 1; })
[...]
> +#define check_region(start,n) __DEPRECATED(use_request_region_return_value), __check_region(&ioport_resource, (start), (n))

So now it's a syntax error to use check_region twice
in the same function?


r~

2002-12-28 15:27:03

by Alexander Kellett

[permalink] [raw]
Subject: Re: [PATCH] Mark deprecated functions so they give a warning on use

On Sat, Dec 28, 2002 at 11:57:10AM +1100, Rusty Russell wrote:
> If anyone can think of a better way, please share. This should speed
> up the removal of functions like check_region() (which, despite
> William's janitorial efforts, is still not at the stage where it can
> be removed).

can gcc 3.2's __attribute__((deprecated)) be used?

(someone noted this on kde lists a few days back)

Alex

2002-12-28 17:42:14

by Robert Love

[permalink] [raw]
Subject: [PATCH] deprecated function attribute

On Sat, 2002-12-28 at 10:30, Alexander Kellett wrote:

> can gcc 3.2's __attribute__((deprecated)) be used?

I just tested it and it seems to work. If we mark a function as
deprecated, then each use of the function emits a warning like:

foo.c:12: warning: `baz' is deprecated (declared at bar.c:60)

Which is very informative, giving both the location of each usage and
where the little bastard is declared.

It seems like this was added in gcc 3.0, not 3.2? It was at least in
3.1...

Attached patch adds support for usage of the attribute as "deprecated"
and is backward-compatible. Usage is:

int deprecated foo(void)

etc.. The attached patch is _entirely_ untested.

Robert Love

compiler.h | 13 +++++++++++++
1 files changed, 13 insertions(+)


diff -urN linux-2.5.53/include/linux/compiler.h linux/include/linux/compiler.h
--- linux-2.5.53/include/linux/compiler.h 2002-12-28 12:38:56.000000000 -0500
+++ linux/include/linux/compiler.h 2002-12-28 12:45:03.000000000 -0500
@@ -13,6 +13,19 @@
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

+/*
+ * Allow us to mark functions as 'deprecated' and have gcc emit a nice
+ * warning for each use, in hopes of speeding the functions removal.
+ * Usage is:
+ * int deprecated foo(void)
+ * and then gcc will emit a warning for each usage of the function.
+ */
+#if __GNUC__ == 3
+#define deprecated __attribute__((deprecated))
+#else
+#define deprecated
+#endif
+
/* This macro obfuscates arithmetic on a variable address so that gcc
shouldn't recognize the original var, and make assumptions about it */
#define RELOC_HIDE(ptr, off) \



2002-12-28 17:54:11

by Robert Love

[permalink] [raw]
Subject: Re: [PATCH] deprecated function attribute

On Sat, 2002-12-28 at 12:51, Robert Love wrote:

> +#if __GNUC__ == 3
> +#define deprecated __attribute__((deprecated))
> +#else
> +#define deprecated
> +#endif

Before someone points it out: I grepped the tree and did not see any
uses of "deprecated" as a token on first glance. So the above is safe.

If we want to be preemptive, we can rename the above to "__deprecated__"
but I think plain "deprecated" is much better looking.

Robert Love

2002-12-28 18:44:05

by Daniel Jacobowitz

[permalink] [raw]
Subject: Re: [PATCH] deprecated function attribute

On Sat, Dec 28, 2002 at 01:03:52PM -0500, Robert Love wrote:
> On Sat, 2002-12-28 at 12:51, Robert Love wrote:
>
> > +#if __GNUC__ == 3
> > +#define deprecated __attribute__((deprecated))
> > +#else
> > +#define deprecated
> > +#endif
>
> Before someone points it out: I grepped the tree and did not see any
> uses of "deprecated" as a token on first glance. So the above is safe.
>
> If we want to be preemptive, we can rename the above to "__deprecated__"
> but I think plain "deprecated" is much better looking.

Eek, please call it something else - something that looks visibly like
a syntax rather than a name. __deprecated or __deprecated__ or
DEPRECATED.

--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer

2002-12-28 20:39:54

by Robert Love

[permalink] [raw]
Subject: Re: [PATCH] deprecated function attribute

On Sat, 2002-12-28 at 13:53, Daniel Jacobowitz wrote:

> > If we want to be preemptive, we can rename the above to "__deprecated__"
> > but I think plain "deprecated" is much better looking.
>
> Eek, please call it something else - something that looks visibly like
> a syntax rather than a name. __deprecated or __deprecated__ or
> DEPRECATED.

Like I said, that is fine with me...

Attached. Still untested :-)

Robert Love

compiler.h | 13 +++++++++++++
1 files changed, 13 insertions(+)


diff -urN linux-2.5.53/include/linux/compiler.h linux/include/linux/compiler.h
--- linux-2.5.53/include/linux/compiler.h 2002-12-28 12:38:56.000000000 -0500
+++ linux/include/linux/compiler.h 2002-12-28 12:45:03.000000000 -0500
@@ -13,6 +13,19 @@
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

+/*
+ * Allow us to mark functions as 'deprecated' and have gcc emit a nice
+ * warning for each use, in hopes of speeding the functions removal.
+ * Usage is:
+ * int deprecated foo(void)
+ * and then gcc will emit a warning for each usage of the function.
+ */
+#if __GNUC__ == 3
+#define __deprecated__ __attribute__((deprecated))
+#else
+#define __deprecated__
+#endif
+
/* This macro obfuscates arithmetic on a variable address so that gcc
shouldn't recognize the original var, and make assumptions about it */
#define RELOC_HIDE(ptr, off) \



2002-12-28 23:25:50

by william stinson

[permalink] [raw]
Subject: Re: [PATCH] deprecated function attribute

Hi Robert,

here's a patch to mark check_region "deprecated".

I have not done much testing with it yet (and maybe there is a more elegant implementation)

I do get nice warning messages for programs that still use check_region for example
drivers/parport/parport_pc.c:2215: warning: `__check_region' is deprecated (declared at include/linux/ioport.h:111)

Best regards
William

--- linux-2.5.53/kernel/resource.c 2002-12-28 23:05:37.000000000 +0100
+++ linux-local/kernel/resource.c 2002-12-28 23:05:55.000000000 +0100
@@ -237,7 +237,7 @@
return res;
}

-int __check_region(struct resource *parent, unsigned long start, unsigned long n)
+int deprecated __check_region(struct resource *parent, unsigned long start, unsigned long n)
{
struct resource * res;

--- linux-2.5.53/include/linux/ioport.h 2002-12-28 23:02:52.000000000 +0100
+++ linux-local/include/linux/ioport.h 2002-12-28 23:14:46.000000000 +0100
@@ -8,6 +8,7 @@
#ifndef _LINUX_IOPORT_H
#define _LINUX_IOPORT_H

+#include <linux/compiler.h>
/*
* Resources are tree-like, allowing
* nesting etc..
@@ -107,7 +108,7 @@
#define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n))
#define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))

-extern int __check_region(struct resource *, unsigned long, unsigned long);
+extern int deprecated __check_region(struct resource *, unsigned long, unsigned long);
extern void __release_region(struct resource *, unsigned long, unsigned long);

#define get_ioport_list(buf) get_resource_list(&ioport_resource, buf, PAGE_SIZE)