[llvm-dev] Supporting RTLIB calls (memset, memcpy, etc)

Dylan McKay via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 28 23:26:40 PDT 2016


It looks like LLVM correctly expanded your operation into a call to a
runtime library function. The bug seems to be that your backend is not
lowering the `call` instruction, causing compilation to fail.

On Thu, Sep 29, 2016 at 10:15 AM, Alex Susu via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

>   Hello.
>     Could you please tell me how can I make my new back end (inspired from
> BPF LLVM back end) select runtime libc calls like memset, etc from LLVM IR
> intrinsics.
>     More exactly, I'm getting the following error:
>       LLVM ERROR: Cannot select: t18: ch,glue = ConnexISD::CALL t16,
> TargetExternalSymbol:i64'memset', Register:i64 %R1, Register:i64 %R2,
> Register:i64 %R3, t16:1
>     This happens after I:
>         - edited method ConnexTargetLowering::ConnexTargetLowering() from
> file lib/Target/Connex/ConnexISelLowering.cpp and registered the RTLIB
> calls like this:
>       // Inspired from lib/Target/ARM/ARMISelLowering.cpp, constructor
> ARMTargetLowering()
>       static const struct {
>         const RTLIB::Libcall Op;
>         const char *const Name;
>         const CallingConv::ID CC;
>         const ISD::CondCode Cond;
>       } MemOpsLibraryCalls[] = {
>         // Memory operations
>         { RTLIB::MEMMOVE, "memmove", CallingConv::C, ISD::SETCC_INVALID },
>         { RTLIB::MEMSET, "memset", CallingConv::C, ISD::SETCC_INVALID },
>       };
>
>       for (const auto &LC : MemOpsLibraryCalls) {
>         setLibcallName(LC.Op, LC.Name);
>         setLibcallCallingConv(LC.Op, LC.CC);
>         if (LC.Cond != ISD::SETCC_INVALID)
>           setCmpLibcallCC(LC.Op, LC.Cond);
>       }
>
>         - added files
>             lib/Target/Connex/ConnexSelectionDAGInfo.cpp, .h inspiring
> from lib/Target/ARM/ARMSelectionDAGInfo.* - I can provide, if required,
> excerpts from these source files.
>
>
>     Note that I had some success to make opt avoid generating these calls
> in LLVM IR, which obviously avoids instruction selection also, by following
> advice from:
>         - http://lists.llvm.org/pipermail/llvm-dev/2012-May/050122.html :
> "How do I disable that feature? I've tried -fno-builtin and/or
> -ffreestanding with no success. clang (as well as gcc) requires that
> freestanding environment provides memcpy, memmove, memset and memcmp."
>         - (http://stackoverflow.com/questions/27511899/llvm-intrinsic-
> functions: "So to prevent (at least the memset) intrinsics in your code
> don't run instcombine on your IR. However, instcombine is a mighty opt pass
> that realy shortens the code.")
>
>
>   Thank you,
>     Alex
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160929/bad340ed/attachment.html>


More information about the llvm-dev mailing list