Are we sure that the "::" edit is still required? It seems to me that recent compilers are able to handle "::" in asm(...) sequences without modification.
Can we move to a minimum compiler version that supports this? Thanks. -Philip On 1/9/11 10:38 AM, Eddie Kohler wrote: > Philip, just to speak up. > > The most important outstanding project for Click is exactly minimizing patch > size. Any help is appreciated! > > The first step is to correctly understand the problem. > > > I still don't get this. Even in a .cpp file, you can have > > > > c++ stuff > > ... > > extern "C" { > > #include "c-header-with-double-colon-asms.h" > > } > > ... > > > > and the compiler should be fine with that. > > > > If not, then the compiler is broken. > > Not quite. As Joonwoo points out "extern "C" {}" doesn't tell the C++ > compiler to stop being a C++ compiler. What is between the braces must still > be correct C++: no use of C++ keywords as variables, no use of C++ operators > like ::, and so forth. This is the main challenge of Click patching. Since > Click's kernel module integrates with Linux, it must include Linux's header > files; and therefore we must change those header files to be equivalent, but > valid, C++ header files. > > Our patches have used a semi-mechanical process to make a bunch of syntactic > changes (like :: => : : in asm statements), and then as you point out include > 1000 lines of real changes. > > The way forward is "patchless". We have written a perl script that automates > the semi-mechanical part. The script, linuxmodule/fixincludes.pl, generates > new, C++-includable header files as part of the build process. These header > files are equivalent to the Linux header files but safe for C++ compilers we > care about. > > Unfortunately fixincludes.pl is not totally trivial and we have had to update > it for new kernel releases. You can look at it to see what it does. Patches > welcome. > > The goal of the patchless project is to make a version of Click that can be > loaded into an UNPATCHED Linux kernel. This would make life a lot easier for > many of our users. However, it's not going to achieve great performance. > Patchless doesn't support polling, for example. And it's not clear that we > can even support total-patchless Click on more recent versions of Linux, > which have removed some of the hooks on which we relied. > > What we HAVE NOT done is separate out the 1000 lines of "real" changes. If > you wanted to help with that process it would be lovely. Joonwoo, Cliff, and > others have discussed some changes on the list to support newer kernels; I > owe responses to them too. > > Eddie > > > On 1/4/11 10:58 PM, Philip Prindeville wrote: >> Ok, I just went back and looked at "click/cxxprotect.h" which includes >> redefinition for C++ keywords like "new" and "virtual". >> >> So has anyone tried to compile Click with minimal patching (i.e. just what >> is necessary to add the required instrumentation and hooks) with a recent >> version of gcc (say 4.3.0 or later)? >> >> >> >> On 1/4/11 7:59 PM, Philip Prindeville wrote: >>> Ok, so it seems to me that the solution is twofold: >>> >>> (1) require a reasonably recent version of gcc; >>> (2) In places where the 'new' keyword is used in header files for inlines, >>> etc. do: >>> >>> #define new __new >>> #include<linux/list.h> >>> #undef new >>> >>> >>> >>> >>> On 1/4/11 6:39 PM, Joonwoo Park wrote: >>>> Hi, >>>> >>>> I don't think 'extern "C"' made any difference. If you were able to >>>> compile your example you should be able to compile even without >>>> 'extern "C"' from your example. >>>> Don't remember exact gcc version but IIRC earlier version of g++ >>>> parses '::' as namespace keyword always. To support old versions, >>>> patching '::' was necessary. >>>> >>>> Joonwoo >>>> >>>> On Tue, Jan 4, 2011 at 5:35 PM, Philip Prindeville >>>> <philipp_s...@redfish-solutions.com> wrote: >>>>> On 1/4/11 12:25 PM, Joonwoo Park wrote: >>>>>> 1 #include<iostream> >>>>>> 2 >>>>>> 3 extern "C" >>>>>> 4 { >>>>>> 5 struct keyword { >>>>>> 6 int new; >>>>>> 7 }; >>>>>> 8 } >>>>>> 9 >>>>>> 10 int main() >>>>>> 11 { >>>>>> 12 return 0; >>>>>> 13 } >>>>> I took that and modified it as: >>>>> >>>>> #include<iostream> >>>>> >>>>> extern "C" >>>>> { >>>>> #include<sys/types.h> >>>>> >>>>> void load_ldt(int32_t ldt) >>>>> { >>>>> asm volatile("lldt %0"::"m" (ldt)); >>>>> } >>>>> } >>>>> >>>>> int main() >>>>> { >>>>> return 0; >>>>> } >>>>> >>>>> >>>>> and it compiled fine. >>>>> >>>>> So that solves part of the problem. >>>>> >>>>> -Philip >>>>> >>>>> >>>>> >>> _______________________________________________ click mailing list click@amsterdam.lcs.mit.edu https://amsterdam.lcs.mit.edu/mailman/listinfo/click