# Linux Kernel Module Cheat

##### 24.22.9.3. gem5 polymorphic ISA includes

E.g. `src/cpu/decode_cache.hh` includes:

    #include "arch/isa_traits.hh"

which in turn is meant to refer to files of form:

    src/arch/<isa>/isa_traits.hh

What happens is that the build system creates a file:

    build/ARM/arch/isa_traits.hh

which contains just:

    #include "arch/arm/isa_traits.hh"

and puts that in the `-I` include path during build.

It appears to be possible to deal with it using preprocessor macros, but it is ugly: https://stackoverflow.com/questions/3178946/using-define-to-include-another-file-in-c-c/3179218#3179218

In addition to the header polymorphism, gem5 also namespaces classes with `TheISA::`, e.g. in `src/cpu/decode_cache.hh`:

    Value items[TheISA::PageBytes];

which is defined at:

    build/ARM/config/the_isa.hh

as:

    #define TheISA ArmISA

and forces already `arm/` specific headers to define their symbols under:

    namespace ArmISA

so I don’t see the point of this pattern, why not just us `PageBytes` directly? Looks like a documentation mechanism to indicate that a certain symbol is ISA specific.

Tested in gem5 2a242c5f59a54bc6b8953f82486f7e6fe0aa9b3d.