[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:25:07 PDT 2018
Nevermind. I saw SimonP just fixed it at 332238.
-Andrea
On Mon, May 14, 2018 at 1:24 PM, Andrea Di Biagio <andrea.dibiagio at gmail.com
> wrote:
> 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(M
>> oduleFlag.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/2a81ff3b/attachment-0001.html>
More information about the llvm-commits
mailing list