[llvm] r332219 - [LLVM-C] Add Bindings For Module Flags
Andrea Di Biagio via llvm-commits
llvm-commits at lists.llvm.org
Mon May 14 05:24:10 PDT 2018
Hi Robert,
this commit introduced a new warning in ' lib/IR/Core.cpp':
warning C4715: 'map_to_llvmModFlagBehavior': not all control paths
return a value
gcc also complains about it:
lib/IR/Core.cpp:293:1: warning: control reaches end of non-void function
[-Wreturn-type]
I think you just forgot to add a llvm_unreachable at the end of that
function.
Could you please fix it?
Thanks,
Andrea
On Mon, May 14, 2018 at 9:09 AM, Robert Widmann via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: codafi
> Date: Mon May 14 01:09:00 2018
> New Revision: 332219
>
> URL: http://llvm.org/viewvc/llvm-project?rev=332219&view=rev
> Log:
> [LLVM-C] Add Bindings For Module Flags
>
> Summary:
> The first foray into merging debug info into the echo tests.
>
> - Add bindings to Module::getModuleFlagsMetadata() in the form of
> LLVMCopyModuleFlagsMetadata
> - Add the opaque type LLVMModuleFlagEntry to represent
> Module::ModuleFlagEntry
> - Add accessors for LLVMModuleFlagEntry's behavior, key, and metadata node.
>
> Reviewers: whitequark, deadalnix
>
> Reviewed By: whitequark
>
> Subscribers: aprantl, JDevlieghere, llvm-commits, harlanhaskins
>
> Differential Revision: https://reviews.llvm.org/D46792
>
> Modified:
> llvm/trunk/include/llvm-c/Core.h
> llvm/trunk/include/llvm-c/Types.h
> llvm/trunk/lib/IR/Core.cpp
> llvm/trunk/test/Bindings/llvm-c/echo.ll
> llvm/trunk/tools/llvm-c-test/echo.cpp
>
> Modified: llvm/trunk/include/llvm-c/Core.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm-c/Core.h?rev=332219&r1=332218&r2=332219&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm-c/Core.h (original)
> +++ llvm/trunk/include/llvm-c/Core.h Mon May 14 01:09:00 2018
> @@ -381,6 +381,57 @@ typedef enum {
> LLVMInlineAsmDialectIntel
> } LLVMInlineAsmDialect;
>
> +typedef enum {
> + /**
> + * Emits an error if two values disagree, otherwise the resulting value
> is
> + * that of the operands.
> + *
> + * @see Module::ModFlagBehavior::Error
> + */
> + LLVMModuleFlagBehaviorError,
> + /**
> + * Emits a warning if two values disagree. The result value will be the
> + * operand for the flag from the first module being linked.
> + *
> + * @see Module::ModFlagBehavior::Warning
> + */
> + LLVMModuleFlagBehaviorWarning,
> + /**
> + * Adds a requirement that another module flag be present and have a
> + * specified value after linking is performed. The value must be a
> metadata
> + * pair, where the first element of the pair is the ID of the module
> flag
> + * to be restricted, and the second element of the pair is the value the
> + * module flag should be restricted to. This behavior can be used to
> + * restrict the allowable results (via triggering of an error) of
> linking
> + * IDs with the **Override** behavior.
> + *
> + * @see Module::ModFlagBehavior::Require
> + */
> + LLVMModuleFlagBehaviorRequire,
> + /**
> + * Uses the specified value, regardless of the behavior or value of the
> + * other module. If both modules specify **Override**, but the values
> + * differ, an error will be emitted.
> + *
> + * @see Module::ModFlagBehavior::Override
> + */
> + LLVMModuleFlagBehaviorOverride,
> + /**
> + * Appends the two values, which are required to be metadata nodes.
> + *
> + * @see Module::ModFlagBehavior::Append
> + */
> + LLVMModuleFlagBehaviorAppend,
> + /**
> + * Appends the two values, which are required to be metadata
> + * nodes. However, duplicate entries in the second list are dropped
> + * during the append operation.
> + *
> + * @see Module::ModFlagBehavior::AppendUnique
> + */
> + LLVMModuleFlagBehaviorAppendUnique,
> +} LLVMModuleFlagBehavior;
> +
> /**
> * Attribute index are either LLVMAttributeReturnIndex,
> * LLVMAttributeFunctionIndex or a parameter number from 1 to N.
> @@ -666,6 +717,64 @@ const char *LLVMGetTarget(LLVMModuleRef
> void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
>
> /**
> + * Returns the module flags as an array of flag-key-value triples. The
> caller
> + * is responsible for freeing this array by calling
> + * \c LLVMDisposeModuleFlagsMetadata.
> + *
> + * @see Module::getModuleFlagsMetadata()
> + */
> +LLVMModuleFlagEntry *LLVMCopyModuleFlagsMetadata(LLVMModuleRef M, size_t
> *Len);
> +
> +/**
> + * Destroys module flags metadata entries.
> + */
> +void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry *Entries);
> +
> +/**
> + * Returns the flag behavior for a module flag entry at a specific index.
> + *
> + * @see Module::ModuleFlagEntry::Behavior
> + */
> +LLVMModuleFlagBehavior
> +LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry *Entries,
> + unsigned Index);
> +
> +/**
> + * Returns the key for a module flag entry at a specific index.
> + *
> + * @see Module::ModuleFlagEntry::Key
> + */
> +const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry *Entries,
> + unsigned Index, size_t *Len);
> +
> +/**
> + * Returns the metadata for a module flag entry at a specific index.
> + *
> + * @see Module::ModuleFlagEntry::Val
> + */
> +LLVMMetadataRef LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry
> *Entries,
> + unsigned Index);
> +
> +/**
> + * Add a module-level flag to the module-level flags metadata if it
> doesn't
> + * already exist.
> + *
> + * @see Module::getModuleFlag()
> + */
> +LLVMMetadataRef LLVMGetModuleFlag(LLVMModuleRef M,
> + const char *Key, size_t KeyLen);
> +
> +/**
> + * Add a module-level flag to the module-level flags metadata if it
> doesn't
> + * already exist.
> + *
> + * @see Module::addModuleFlag()
> + */
> +void LLVMAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior,
> + const char *Key, size_t KeyLen,
> + LLVMMetadataRef Val);
> +
> +/**
> * Dump a representation of a module to stderr.
> *
> * @see Module::dump()
>
> Modified: llvm/trunk/include/llvm-c/Types.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm-c/Types.h?rev=332219&r1=332218&r2=332219&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm-c/Types.h (original)
> +++ llvm/trunk/include/llvm-c/Types.h Mon May 14 01:09:00 2018
> @@ -140,6 +140,11 @@ typedef struct LLVMOpaqueDiagnosticInfo
> typedef struct LLVMComdat *LLVMComdatRef;
>
> /**
> + * @see llvm::Module::ModuleFlagEntry
> + */
> +typedef struct LLVMOpaqueModuleFlagEntry LLVMModuleFlagEntry;
> +
> +/**
> * @}
> */
>
>
> Modified: llvm/trunk/lib/IR/Core.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> Core.cpp?rev=332219&r1=332218&r2=332219&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/Core.cpp (original)
> +++ llvm/trunk/lib/IR/Core.cpp Mon May 14 01:09:00 2018
> @@ -266,6 +266,110 @@ void LLVMSetTarget(LLVMModuleRef M, cons
> unwrap(M)->setTargetTriple(Triple);
> }
>
> +/*--.. Module flags ..............................
> ..........................--*/
> +struct LLVMOpaqueModuleFlagEntry {
> + LLVMModuleFlagBehavior Behavior;
> + const char *Key;
> + size_t KeyLen;
> + LLVMMetadataRef Metadata;
> +};
> +
> +static Module::ModFlagBehavior
> +map_to_llvmModFlagBehavior(LLVMModuleFlagBehavior Behavior) {
> + switch (Behavior) {
> + case LLVMModuleFlagBehaviorError:
> + return Module::ModFlagBehavior::Error;
> + case LLVMModuleFlagBehaviorWarning:
> + return Module::ModFlagBehavior::Warning;
> + case LLVMModuleFlagBehaviorRequire:
> + return Module::ModFlagBehavior::Require;
> + case LLVMModuleFlagBehaviorOverride:
> + return Module::ModFlagBehavior::Override;
> + case LLVMModuleFlagBehaviorAppend:
> + return Module::ModFlagBehavior::Append;
> + case LLVMModuleFlagBehaviorAppendUnique:
> + return Module::ModFlagBehavior::AppendUnique;
> + }
> +}
> +
> +static LLVMModuleFlagBehavior
> +map_from_llvmModFlagBehavior(Module::ModFlagBehavior Behavior) {
> + switch (Behavior) {
> + case Module::ModFlagBehavior::Error:
> + return LLVMModuleFlagBehaviorError;
> + case Module::ModFlagBehavior::Warning:
> + return LLVMModuleFlagBehaviorWarning;
> + case Module::ModFlagBehavior::Require:
> + return LLVMModuleFlagBehaviorRequire;
> + case Module::ModFlagBehavior::Override:
> + return LLVMModuleFlagBehaviorOverride;
> + case Module::ModFlagBehavior::Append:
> + return LLVMModuleFlagBehaviorAppend;
> + case Module::ModFlagBehavior::AppendUnique:
> + return LLVMModuleFlagBehaviorAppendUnique;
> + default:
> + llvm_unreachable("Unhandled Flag Behavior");
> + }
> +}
> +
> +LLVMModuleFlagEntry *LLVMCopyModuleFlagsMetadata(LLVMModuleRef M, size_t
> *Len) {
> + SmallVector<Module::ModuleFlagEntry, 8> MFEs;
> + unwrap(M)->getModuleFlagsMetadata(MFEs);
> +
> + LLVMOpaqueModuleFlagEntry *Result = static_cast<LLVMOpaqueModuleFlagEntry
> *>(
> + safe_malloc(MFEs.size() * sizeof(LLVMOpaqueModuleFlagEntry)));
> + for (unsigned i = 0; i < MFEs.size(); ++i) {
> + const auto &ModuleFlag = MFEs[i];
> + Result[i].Behavior = map_from_llvmModFlagBehavior(
> ModuleFlag.Behavior);
> + Result[i].Key = ModuleFlag.Key->getString().data();
> + Result[i].KeyLen = ModuleFlag.Key->getString().size();
> + Result[i].Metadata = wrap(ModuleFlag.Val);
> + }
> + *Len = MFEs.size();
> + return Result;
> +}
> +
> +void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry *Entries) {
> + free(Entries);
> +}
> +
> +LLVMModuleFlagBehavior
> +LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry *Entries,
> + unsigned Index) {
> + LLVMOpaqueModuleFlagEntry MFE =
> + static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
> + return MFE.Behavior;
> +}
> +
> +const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry *Entries,
> + unsigned Index, size_t *Len) {
> + LLVMOpaqueModuleFlagEntry MFE =
> + static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
> + *Len = MFE.KeyLen;
> + return MFE.Key;
> +}
> +
> +LLVMMetadataRef LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry
> *Entries,
> + unsigned Index) {
> + LLVMOpaqueModuleFlagEntry MFE =
> + static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
> + return MFE.Metadata;
> +}
> +
> +LLVMMetadataRef LLVMGetModuleFlag(LLVMModuleRef M,
> + const char *Key, size_t KeyLen) {
> + return wrap(unwrap(M)->getModuleFlag({Key, KeyLen}));
> +}
> +
> +void LLVMAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior,
> + const char *Key, size_t KeyLen,
> + LLVMMetadataRef Val) {
> + unwrap(M)->addModuleFlag(map_to_llvmModFlagBehavior(Behavior),
> + {Key, KeyLen}, unwrap(Val));
> +}
> +
> +/*--.. Printing modules ..............................
> ......................--*/
> +
> void LLVMDumpModule(LLVMModuleRef M) {
> unwrap(M)->print(errs(), nullptr,
> /*ShouldPreserveUseListOrder=*/false,
> /*IsForDebug=*/true);
>
> Modified: llvm/trunk/test/Bindings/llvm-c/echo.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> Bindings/llvm-c/echo.ll?rev=332219&r1=332218&r2=332219&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/Bindings/llvm-c/echo.ll (original)
> +++ llvm/trunk/test/Bindings/llvm-c/echo.ll Mon May 14 01:09:00 2018
> @@ -159,3 +159,7 @@ cleanup:
> exit:
> ret void
> }
> +
> +!llvm.module.flags = !{!1}
> +
> +!1 = !{i32 2, !"Debug Info Version", i32 3}
>
> Modified: llvm/trunk/tools/llvm-c-test/echo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
> c-test/echo.cpp?rev=332219&r1=332218&r2=332219&view=diff
> ============================================================
> ==================
> --- llvm/trunk/tools/llvm-c-test/echo.cpp (original)
> +++ llvm/trunk/tools/llvm-c-test/echo.cpp Mon May 14 01:09:00 2018
> @@ -997,6 +997,18 @@ int llvm_echo(void) {
> LLVMSetSourceFileName(M, SourceFileName, SourceFileLen);
> LLVMSetModuleIdentifier(M, ModuleName, ModuleIdentLen);
>
> + size_t SourceFlagsLen;
> + LLVMModuleFlagEntry *ModuleFlags =
> + LLVMCopyModuleFlagsMetadata(Src, &SourceFlagsLen);
> + for (unsigned i = 0; i < SourceFlagsLen; ++i) {
> + size_t EntryNameLen;
> + const char *EntryName =
> + LLVMModuleFlagEntriesGetKey(ModuleFlags, i, &EntryNameLen);
> + LLVMAddModuleFlag(M, LLVMModuleFlagEntriesGetFlagBehavior(ModuleFlags,
> i),
> + EntryName, EntryNameLen,
> + LLVMModuleFlagEntriesGetMetadata(ModuleFlags, i));
> + }
> +
> LLVMSetTarget(M, LLVMGetTarget(Src));
> LLVMSetModuleDataLayout(M, LLVMGetModuleDataLayout(Src));
> if (strcmp(LLVMGetDataLayoutStr(M), LLVMGetDataLayoutStr(Src)))
> @@ -1011,6 +1023,7 @@ int llvm_echo(void) {
> char *Str = LLVMPrintModuleToString(M);
> fputs(Str, stdout);
>
> + LLVMDisposeModuleFlagsMetadata(ModuleFlags);
> LLVMDisposeMessage(Str);
> LLVMDisposeModule(Src);
> LLVMDisposeModule(M);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180514/d9cd3107/attachment.html>
More information about the llvm-commits
mailing list