[PATCH] D19671: Add "PIE Level" metadata to module flags

Sriraman Tallam via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 28 13:29:32 PDT 2016


On Thu, Apr 28, 2016 at 11:53 AM, Rafael EspĂ­ndola
<rafael.espindola at gmail.com> wrote:
> Out of curiosity. What is the relationship of this and
>
> enum Model { Default, Static, PIC_, DynamicNoPIC };
>
> Is the enum something we should deprecate and eventually remove? The
> medata is used only on The powerpc backend right now.

* It seems like the only additional piece of information we get via
Model is Static or Dynamic.  We know about PIC with PICLevel.  Since
Model is used widely, we could remove "PIC Level" metadata after
fixing powerpc backend to use Model.
* I am planning to use the PIELevel metadata along with
copyrelocations support (yet to be added) to optimize access to
globals and remove target option PositionIndependentExecutable.


>
> Cheers,
> Rafael
>
>
> On 28 April 2016 at 13:18, Sriraman Tallam via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> tmsriram created this revision.
>> tmsriram added reviewers: rnk, davidxl.
>> tmsriram added a subscriber: llvm-commits.
>>
>> Currently, with -fPIC,
>>
>> We see this:
>>
>> !llvm.module.flags = !{!0}
>> !0 = !{i32 1, !"PIC Level", i32 2}
>>
>> and module.getPICLevel() is used to query PIC.  I am doing the same for PIE.
>>
>> I will follow this up with patches to:
>>
>> * Set PIE Level in LLVM in Clang and delete llvm::TargetOptions::PositionIndependentExecutable target member.
>> * Use Module::getPIELevel to check for PIE.
>>
>>
>> http://reviews.llvm.org/D19671
>>
>> Files:
>>   include/llvm/IR/Module.h
>>   include/llvm/Support/CodeGen.h
>>   lib/IR/Module.cpp
>>
>> Index: lib/IR/Module.cpp
>> ===================================================================
>> --- lib/IR/Module.cpp
>> +++ lib/IR/Module.cpp
>> @@ -497,6 +497,20 @@
>>    addModuleFlag(ModFlagBehavior::Error, "PIC Level", PL);
>>  }
>>
>> +PIELevel::Level Module::getPIELevel() const {
>> +  auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level"));
>> +
>> +  if (!Val)
>> +    return PIELevel::Default;
>> +
>> +  return static_cast<PIELevel::Level>(
>> +      cast<ConstantInt>(Val->getValue())->getZExtValue());
>> +}
>> +
>> +void Module::setPIELevel(PIELevel::Level PL) {
>> +  addModuleFlag(ModFlagBehavior::Error, "PIE Level", PL);
>> +}
>> +
>>  void Module::setMaximumFunctionCount(uint64_t Count) {
>>    addModuleFlag(ModFlagBehavior::Error, "MaxFunctionCount", Count);
>>  }
>> Index: include/llvm/Support/CodeGen.h
>> ===================================================================
>> --- include/llvm/Support/CodeGen.h
>> +++ include/llvm/Support/CodeGen.h
>> @@ -32,6 +32,10 @@
>>      enum Level { Default=0, Small=1, Large=2 };
>>    }
>>
>> +  namespace PIELevel {
>> +    enum Level { Default=0, Small=1, Large=2 };
>> +  }
>> +
>>    // TLS models.
>>    namespace TLSModel {
>>      enum Model {
>> Index: include/llvm/IR/Module.h
>> ===================================================================
>> --- include/llvm/IR/Module.h
>> +++ include/llvm/IR/Module.h
>> @@ -732,6 +732,17 @@
>>    void setPICLevel(PICLevel::Level PL);
>>  /// @}
>>
>> +/// @}
>> +/// @name Utility functions for querying and setting PIE level
>> +/// @{
>> +
>> +  /// \brief Returns the PIE level (small or large model)
>> +  PIELevel::Level getPIELevel() const;
>> +
>> +  /// \brief Set the PIE level (small or large model)
>> +  void setPIELevel(PIELevel::Level PL);
>> +/// @}
>> +
>>    /// @name Utility functions for querying and setting PGO summary
>>    /// @{
>>
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>


More information about the llvm-commits mailing list