<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Nick,<div><br class="webkit-block-placeholder"></div><div>I don't have any comments on the substance of the APIs (I'm not expert in this area), just some style notes. Overall, the capitalization style is inconsistent with the bulk of the C bindings, which are more Carbon than GNU.</div><div><br><div><div>On Feb 23, 2008, at 01:34, Nick Kledzik wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "> <div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">#include <stdint.h></span></font></span></div><div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">#include <stdbool.h></span></font></div></div></div></blockquote><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Note that MSVC++ still doesn't support C99, and is a target for LLVM. I'd suggest </span><font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">bool</span></font><span class="Apple-style-span" style="background-color: transparent;"> -> </span><font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">int</span></font><span class="Apple-style-span" style="background-color: transparent;"> and </span><font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">uint8_t*</span></font><font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 12px; "> -> </span>void*</span></font><span class="Apple-style-span" style="background-color: transparent;"> to resolve the dependency.</span></font></div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br></span></font><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">#include <stddef.h></span></font></div></div></div></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern const char*</span></font></span></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">lto_get_error_message();</span></font></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">I've tried not to create thread-unsafe designs in the rest of the bindings. I return a malloced error message by optional output parameters and provide a generic dispose function (<font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">LLVMDisposeMessage</span></font>). Copying <font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">CFError</span></font>'s design might be smarter still.</span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div></div></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FB0" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern bool</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_is_object_file_in_memory(const uint8_t* mem, size_t length);</span></font></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><blockquote type="cite"><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;"><br class="webkit-block-placeholder"></span></font></blockquote><blockquote type="cite"><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern bool</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_is_object_file_in_memory_for_target(const uint8_t* mem, size_t length, </span></font></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">                                               const char* target_triplet_prefix);</span></font></div></blockquote><blockquote type="cite"><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;"><br></span></font></blockquote><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern lto_module_t</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_create_from_memory(const uint8_t* mem, size_t length);</span></font></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div></div></div><div><font class="Apple-style-span" face="Monaco" size="1"><br class="webkit-block-placeholder"></font></div></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Why not </span><font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">void*</span></font><span class="Apple-style-span" style="background-color: transparent;">? Saves casting.</span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div><div><blockquote type="cite"><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><div><font class="Apple-style-span" face="Monaco" size="1">//</font></div><div><font class="Apple-style-span" face="Monaco" size="1">// generates code for all added modules into one object file</font></div><div><font class="Apple-style-span" face="Monaco" size="1">// On sucess returns a pointer to a generated mach-o buffer and</font></div><div><font class="Apple-style-span" face="Monaco" size="1">// length set to the buffer size.  Client must free() the buffer</font></div><div><font class="Apple-style-span" face="Monaco" size="1">// when done.</font></div><div><font class="Apple-style-span" face="Monaco" size="1">// On failure, returns NULL (check lto_get_error_message() for details)</font></div><div><font class="Apple-style-span" face="Monaco" size="1">//</font></div></span><div><font class="Apple-style-span" face="Monaco" size="1">extern const uint8_t*</font></div><div><font class="Apple-style-span" face="Monaco" size="1">lto_codegen_compile(lto_code_gen_t cg, size_t* length);</font></div></blockquote><br></div><div>The return value should be non-const. <font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">free</span></font> takes a <font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">void*</span></font>, not a <font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">const void*</span></font>.</div><div><br class="webkit-block-placeholder"></div><div>Windows people like to play hideous macro tricks with <font class="Apple-style-span" color="#000000" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">malloc</span></font>, so I'd provide a corresponding dispose method, keeping the API self-contained.</div><div><br class="webkit-block-placeholder"></div></div></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern const char*</span></font></span></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><blockquote type="cite"><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1">lto_module_get_target_triplet(lto_module_t mod);</font></div></blockquote></div></div></div><br><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">LLVM nomenclature is triple, not triplet.</span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div></div></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern uint32_t</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_get_num_symbols(lto_module_t mod);</span></font></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><blockquote type="cite"><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;"><br class="webkit-block-placeholder"></span></font></blockquote><blockquote type="cite"><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1px; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern const char*</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_get_symbol_name(lto_module_t mod, uint32_t index);</span></font></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;"><br class="webkit-block-placeholder"></span></font></div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1px; "><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">extern lto_symbol_attributes</span></font></span></div><div><font class="Apple-style-span" color="#004FAF" face="Monaco" size="1"><span class="Apple-style-span" style="background-color: transparent; font-size: 9px;">lto_module_get_symbol_attribute(lto_module_t mod, uint32_t index);</span></font></div></blockquote></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Why <font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">uint32_t</span></font> instead of <font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">size_t</span></font>?</span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div></div></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">//</span></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">// frees all memory for a code generator</span></font></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">// upon return the lto_code_gen_t is no longer valid</span></font></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">//</span></font></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">extern void</span></font></div><div><font class="Apple-style-span" face="Monaco" size="1"><span class="Apple-style-span" style="font-size: 9px;">lto_codegen_release(lto_code_gen_t);</span></font></div></div></div></blockquote><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"><br class="webkit-block-placeholder"></span></font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;">Existing bindings use the term dispose to avoid any possible retain/release confusion.</span></font></div><div><br></div><div>— Gordon</div></div></div></div><div apple-content-edited="true"> </div><br></div></body></html>