ZIN MOON via llvm-dev
2020-Jan-16 09:18 UTC
[llvm-dev] Is there a way to map from coerced parameter to original parameter
Hello. Some parameters of the function would be changed according to ABI rules by compiler I would like to mapping from coerced parameters of the function(by compiler(clang)) to C code. For example, In C typedef struct data_info { char *buf; size_t size; } data_info; data_info foo(data_info src, int result) { data_info dst; dst.buf = (char *)malloc(src.size); memcpy((dst.buf, src.buf, src.size); return dst; } In IR (with reg2mem, no opt) define {i8 *, i64} @foo(i8*, i64, i32*) #0 { %4 = alloc %struct.dat_info, align 8 %5 = alloc %struct.dat_info, align 8 %6 = bitcast %struct.data_info* %6 to {i8 *, i64} %7 = getelementptr inbounds {i8 *, i64}, {i8 *, i64}* %6, i32 0, i32 0 %8 = getelementptr inbounds {i8 *, i64}, {i8 *, i64}* %6, i32 0, i32 1 ..... } The foo function has 2 parameter in C code, but IR code has 3 parameters. There is mismatch between C code and IR code. I want to mapping parameters from IR to C code like in the below 1st parameter (i8 *) in IR code-> 1st field of the first parameter of the function in C 2nd (i64) -> 2nd field of the 1st parameter of the function in C. 3rd (i32 *) -> 2nd parameter of the function in C. Is there any class or tools for it in LLVM. Please advise the way/idea to map between original parameter in C code and coerced parameter in IR code -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200116/7be5ec08/attachment.html>
Doerfert, Johannes via llvm-dev
2020-Jan-16 09:36 UTC
[llvm-dev] Is there a way to map from coerced parameter to original parameter
Hi, I do not think there is a way guaranteed to work. If the changes due to the ABI are actually not important for you I recommend compiling for a target like wasm instead. The mapping IR argument -> C argument becomes simpler. (Though the optimization caveat still exists.) If you cannot change the target: Debug metadata might help but I'm not sure how much. One other way that could be explored would be to involve clang. I doubt that this code path exists. The idea is to ask clang from the LLVM pass, e.g., via a custom analysis remark, what the mapping is. Similarly you could emit the mapping from the beginning as metadata. However, all approaches might be prone to errors once you start optimizing the code. I hope this helps, Johannes P.S. This question came up multiple times over the years. I don't have a link to an older discussion handy but you might be able to find it via google. On 01/16, ZIN MOON via llvm-dev wrote:> Hello. > > Some parameters of the function would be changed according to ABI rules by > compiler > I would like to mapping from coerced parameters of the function(by > compiler(clang)) to C code. > > For example, > > In C > typedef struct data_info > { > char *buf; > size_t size; > } data_info; > > data_info foo(data_info src, int result) > { > data_info dst; > dst.buf = (char *)malloc(src.size); > memcpy((dst.buf, src.buf, src.size); > return dst; > } > > In IR (with reg2mem, no opt) > > define {i8 *, i64} @foo(i8*, i64, i32*) #0 { > %4 = alloc %struct.dat_info, align 8 > %5 = alloc %struct.dat_info, align 8 > %6 = bitcast %struct.data_info* %6 to {i8 *, i64} > %7 = getelementptr inbounds {i8 *, i64}, {i8 *, i64}* %6, i32 0, i32 0 > %8 = getelementptr inbounds {i8 *, i64}, {i8 *, i64}* %6, i32 0, i32 1 > ..... > } > > The foo function has 2 parameter in C code, but IR code has 3 parameters. > There is mismatch between C code and IR code. > > I want to mapping parameters from IR to C code like in the below > > 1st parameter (i8 *) in IR code-> 1st field of the first parameter of the > function in C > 2nd (i64) -> 2nd field of the 1st parameter of the function in C. > 3rd (i32 *) -> 2nd parameter of the function in C. > > Is there any class or tools for it in LLVM. > Please advise the way/idea to map between original parameter in C code and > coerced parameter in IR code> _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-- Johannes Doerfert Researcher Argonne National Laboratory Lemont, IL 60439, USA jdoerfert at anl.gov -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 228 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200116/295ebb59/attachment.sig>