[llvm] r193377 - lto.h: Use lto_bool_t instead of int to restore the ABI

Sean Silva silvas at purdue.edu
Thu Oct 24 18:40:28 PDT 2013


Did I miss something? What's wrong with `int`? This is a C API and using an
int for a "status"/"boolean" is nonproblematic (even expected, I would say;
all C API's use int's for statuses/booleans). This patch seems like
needless hassle. Furthermore, conditionalizing the actual type seems likely
to induce future changes to the meaning of this typedef, thus breaking ABI
compatibility.

Actually, bool has the "does true mean success or failure?" problem. With
`int` you don't have this problem since it is either "status"/"errno"-ish
(0 is success, < 0 is error), like `stat` or a boolean-int (1 is true, 0 is
false; this is built into the core language's boolean logical operators),
and which it is is completely obvious from the function name (and of
course, one can still refer to the function's documentation if need be).

-- Sean Silva


On Thu, Oct 24, 2013 at 6:26 PM, Reid Kleckner <reid at kleckner.net> wrote:

> Author: rnk
> Date: Thu Oct 24 17:26:04 2013
> New Revision: 193377
>
> URL: http://llvm.org/viewvc/llvm-project?rev=193377&view=rev
> Log:
> lto.h: Use lto_bool_t instead of int to restore the ABI
>
> This reverts commit r193255 and instead creates an lto_bool_t typedef
> that points to bool, _Bool, or unsigned char depending on what is
> available.  Only recent versions of MSVC provide a stdbool.h header.
>
> Reviewers: rafael.espindola
>
> Differential Revision: http://llvm-reviews.chandlerc.com/D2019
>
> Modified:
>     llvm/trunk/include/llvm-c/lto.h
>     llvm/trunk/tools/lto/lto.cpp
>
> Modified: llvm/trunk/include/llvm-c/lto.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=193377&r1=193376&r2=193377&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm-c/lto.h (original)
> +++ llvm/trunk/include/llvm-c/lto.h Thu Oct 24 17:26:04 2013
> @@ -19,6 +19,20 @@
>  #include <stddef.h>
>  #include <sys/types.h>
>
> +#ifndef __cplusplus
> +#if !defined(_MSC_VER)
> +#include <stdbool.h>
> +typedef bool lto_bool_t;
> +#else
> +// MSVC in particular does not have anything like _Bool or bool in C, but
> we can
> +// at least make sure the type is the same size.  The implementation side
> will
> +// use C++ bool.
> +typedef unsigned char lto_bool_t;
> +#endif
> +#else
> +typedef bool lto_bool_t;
> +#endif
> +
>  /**
>   * @defgroup LLVMCLTO LTO
>   * @ingroup LLVMC
> @@ -86,14 +100,14 @@ lto_get_error_message(void);
>  /**
>   * Checks if a file is a loadable object file.
>   */
> -extern int
> +extern lto_bool_t
>  lto_module_is_object_file(const char* path);
>
>
>  /**
>   * Checks if a file is a loadable object compiled for requested target.
>   */
> -extern int
> +extern lto_bool_t
>  lto_module_is_object_file_for_target(const char* path,
>                                       const char* target_triple_prefix);
>
> @@ -101,14 +115,14 @@ lto_module_is_object_file_for_target(con
>  /**
>   * Checks if a buffer is a loadable object file.
>   */
> -extern int
> +extern lto_bool_t
>  lto_module_is_object_file_in_memory(const void* mem, size_t length);
>
>
>  /**
>   * Checks if a buffer is a loadable object compiled for requested target.
>   */
> -extern int
> +extern lto_bool_t
>  lto_module_is_object_file_in_memory_for_target(const void* mem, size_t
> length,
>                                                const char*
> target_triple_prefix);
>
> @@ -207,7 +221,7 @@ lto_codegen_dispose(lto_code_gen_t);
>   * Add an object module to the set of modules for which code will be
> generated.
>   * Returns true on error (check lto_get_error_message() for details).
>   */
> -extern int
> +extern lto_bool_t
>  lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod);
>
>
> @@ -216,7 +230,7 @@ lto_codegen_add_module(lto_code_gen_t cg
>   * Sets if debug info should be generated.
>   * Returns true on error (check lto_get_error_message() for details).
>   */
> -extern int
> +extern lto_bool_t
>  lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model);
>
>
> @@ -224,7 +238,7 @@ lto_codegen_set_debug_model(lto_code_gen
>   * Sets which PIC code model to generated.
>   * Returns true on error (check lto_get_error_message() for details).
>   */
> -extern int
> +extern lto_bool_t
>  lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model);
>
>
> @@ -270,7 +284,7 @@ extern void lto_codegen_add_dso_symbol(l
>   * merged contents of all modules added so far.
>   * Returns true on error (check lto_get_error_message() for details).
>   */
> -extern int
> +extern lto_bool_t
>  lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path);
>
>  /**
> @@ -288,7 +302,7 @@ lto_codegen_compile(lto_code_gen_t cg, s
>   * Generates code for all added modules into one native object file.
>   * The name of the file is written to name. Returns true on error.
>   */
> -extern int
> +extern lto_bool_t
>  lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name);
>
>
>
> Modified: llvm/trunk/tools/lto/lto.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=193377&r1=193376&r2=193377&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.cpp (original)
> +++ llvm/trunk/tools/lto/lto.cpp Thu Oct 24 17:26:04 2013
> @@ -90,26 +90,26 @@ const char* lto_get_error_message() {
>  }
>
>  /// lto_module_is_object_file - Validates if a file is a loadable object
> file.
> -int lto_module_is_object_file(const char* path) {
> +bool lto_module_is_object_file(const char* path) {
>    return LTOModule::isBitcodeFile(path);
>  }
>
>  /// lto_module_is_object_file_for_target - Validates if a file is a
> loadable
>  /// object file compilable for requested target.
> -int lto_module_is_object_file_for_target(const char* path,
> +bool lto_module_is_object_file_for_target(const char* path,
>                                            const char*
> target_triplet_prefix) {
>    return LTOModule::isBitcodeFileForTarget(path, target_triplet_prefix);
>  }
>
>  /// lto_module_is_object_file_in_memory - Validates if a buffer is a
> loadable
>  /// object file.
> -int lto_module_is_object_file_in_memory(const void* mem, size_t length) {
> +bool lto_module_is_object_file_in_memory(const void* mem, size_t length) {
>    return LTOModule::isBitcodeFile(mem, length);
>  }
>
>  /// lto_module_is_object_file_in_memory_for_target - Validates if a
> buffer is a
>  /// loadable object file compilable for the target.
> -int
> +bool
>  lto_module_is_object_file_in_memory_for_target(const void* mem,
>                                              size_t length,
>                                              const char*
> target_triplet_prefix) {
> @@ -216,21 +216,21 @@ void lto_codegen_dispose(lto_code_gen_t
>  /// lto_codegen_add_module - Add an object module to the set of modules
> for
>  /// which code will be generated. Returns true on error (check
>  /// lto_get_error_message() for details).
> -int lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) {
> +bool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) {
>    return !cg->addModule(mod, sLastErrorString);
>  }
>
>  /// lto_codegen_set_debug_model - Sets what if any format of debug info
> should
>  /// be generated. Returns true on error (check lto_get_error_message() for
>  /// details).
> -int lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug)
> {
> +bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model
> debug) {
>    cg->setDebugInfo(debug);
>    return false;
>  }
>
>  /// lto_codegen_set_pic_model - Sets what code model to generated.
> Returns true
>  /// on error (check lto_get_error_message() for details).
> -int lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model)
> {
> +bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model
> model) {
>    cg->setCodePICModel(model);
>    return false;
>  }
> @@ -267,7 +267,7 @@ void lto_codegen_add_dso_symbol(lto_code
>  /// lto_codegen_write_merged_modules - Writes a new file at the specified
> path
>  /// that contains the merged contents of all modules added so far.
> Returns true
>  /// on error (check lto_get_error_message() for details).
> -int lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path)
> {
> +bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char
> *path) {
>    if (!parsedOptions) {
>      cg->parseCodeGenDebugOptions();
>      parsedOptions = true;
> @@ -293,7 +293,7 @@ const void *lto_codegen_compile(lto_code
>  /// lto_codegen_compile_to_file - Generates code for all added modules
> into one
>  /// native object file. The name of the file is written to name. Returns
> true on
>  /// error.
> -int lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
> +bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
>    if (!parsedOptions) {
>      cg->parseCodeGenDebugOptions();
>      parsedOptions = true;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131024/33507e7a/attachment.html>


More information about the llvm-commits mailing list