leveraging back-end C compiler features in the gcc-based front-end

i’m looking into using llvm with TI’s MSP430, for which a C compiler from TI already exists; the idea here is to use llc -march=c and then pass the generated C code on to the TI compiler. as it turns out, the TI C compiler supports a number of (processor-specific) intrinsics that expose much of the underlying CPU architecture directly to the C programmer – registers, pseudo-functions for enabling/disabling interrupts and reading/writing status bits, etc.

is there a way to leverage these (non-gcc) intrinsics in the llvm gcc-based frontend – perhaps flagging their use in such a way that they effectively “pass through” the optimizer and are emitted “as is” in the generated C code? in some respects, you can think of this usage as not unlike dropping inline asm code into the C sources.

bob frankel

i'm looking into using llvm with TI's MSP430

Ah, you're in luck then: an MSP430 backend was checked in to SVN today
:slight_smile: I don't think it's mature enough for general use yet, though.

is there a way to leverage these (non-gcc) intrinsics in the llvm gcc-based
frontend -- perhaps flagging their use in such a way that they effectively
"pass through" the optimizer and are emitted "as is" in the generated C
code? in some respects, you can think of this usage as not unlike dropping
inline asm code into the C sources.

You could try just generating calls to the builtins in question; if
you're lucky, it'll just work... if not, you can always use sed (or
equivalent) to manipulate the C output into the correct form.

-Eli

wow!!! i would be interested in trying this… any helpful instructions (for a novice like me) to get started using the msp430 backend would be helpful…

as for your suggestion, it does work – i can (say) place a call to __get_SR_register() in my front-end source, and it simply shows up in the back-end .c file; other “extensions” to compilers (such as ‘interrupt’ keyword to generate different prologue/epilogue code) would be a little trickier (though there are presumably already gcc mechansims for flagging interrupt routines??)

Eli Friedman wrote:

If you've built clang (http://clang.llvm.org/), you can use a command
like "clang -ccc-host-triple msp430-generic-generic -ccc-clang-archs
msp430 -x c - -o - -S -O" and type in some C code, and it'll spit out
msp430 assembly. (The -ccc-host-triple and -cc-clang-archs arguments
are magic; besides that, clang takes the same arguments as gcc.)

-Eli

Hello, Bob

supports a number of (processor-specific) intrinsics that expose much of the
underlying CPU architecture directly to the C programmer -- registers,
pseudo-functions for enabling/disabling interrupts and reading/writing
status bits, etc.

Nothing special here. All this can be implemented either via inline
assembler and/or via register-tied variables. I have no idea whether
mspgcc supports this, but this certainly possible.

Hello, Bob

wow!!! i would be interested in trying this.... any helpful instructions
(for a novice like me) to get started using the msp430 backend would be
helpful....

It depends what you want to do with it. It's definitely not mature
enough, so... "patches are welcome" :slight_smile: Please read readme.txt in the
backend dir for some information & possible tasks if you're interested
in it.