From: Justin Hibbits Date: Fri, 7 Nov 2014 04:46:10 +0000 (+0000) Subject: Add Position-independent Code model Module API. X-Git-Tag: android-x86-7.1-r4~55713 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=893f22f88245d29487e1fff662ac9e78f86f8e91;p=android-x86%2Fexternal-llvm.git Add Position-independent Code model Module API. Summary: This makes PIC levels a Module flag attribute, which can be queried by the backend. The flag is named `PIC Level`, and can have a value of: 0 - Backend-default 1 - Small-model (-fpic) 2 - Large-model (-fPIC) These match the `-pic-level' command line argument for clang, and the value of the preprocessor macro `__PIC__'. Test Plan: New flags tests specific for the 'PIC Level' module flag. Tests to be added as part of a future commit for PowerPC, which will use this new API. Reviewers: rafael, echristo Reviewed By: rafael, echristo Subscribers: rafael, llvm-commits Differential Revision: http://reviews.llvm.org/D5882 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221510 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/Module.h b/include/llvm/IR/Module.h index 8bf67a3efea..23bdde56c71 100644 --- a/include/llvm/IR/Module.h +++ b/include/llvm/IR/Module.h @@ -23,6 +23,7 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/Metadata.h" #include "llvm/Support/CBindingWrapping.h" +#include "llvm/Support/CodeGen.h" #include "llvm/Support/DataTypes.h" #include @@ -634,6 +635,15 @@ public: unsigned getDwarfVersion() const; /// @} +/// @name Utility functions for querying and setting PIC level +/// @{ + + /// \brief Returns the PIC level (small or large model) + PICLevel::Level getPICLevel() const; + + /// \brief Set the PIC level (small or large model) + void setPICLevel(PICLevel::Level PL); +/// @} }; /// An raw_ostream inserter for modules. diff --git a/include/llvm/Support/CodeGen.h b/include/llvm/Support/CodeGen.h index 240eba6c8a4..243f2dd7498 100644 --- a/include/llvm/Support/CodeGen.h +++ b/include/llvm/Support/CodeGen.h @@ -30,6 +30,10 @@ namespace llvm { enum Model { Default, JITDefault, Small, Kernel, Medium, Large }; } + namespace PICLevel { + enum Level { Default=0, Small=1, Large=2 }; + } + // TLS models. namespace TLSModel { enum Model { diff --git a/lib/IR/Module.cpp b/lib/IR/Module.cpp index 35d28481fcb..bc50db3f56c 100644 --- a/lib/IR/Module.cpp +++ b/lib/IR/Module.cpp @@ -459,3 +459,16 @@ Comdat *Module::getOrInsertComdat(StringRef Name) { Entry.second.Name = &Entry; return &Entry.second; } + +PICLevel::Level Module::getPICLevel() const { + Value *Val = getModuleFlag("PIC Level"); + + if (Val == NULL) + return PICLevel::Default; + + return static_cast(cast(Val)->getZExtValue()); +} + +void Module::setPICLevel(PICLevel::Level PL) { + addModuleFlag(ModFlagBehavior::Error, "PIC Level", PL); +} diff --git a/test/Linker/Inputs/module-flags-pic-1-b.ll b/test/Linker/Inputs/module-flags-pic-1-b.ll new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/test/Linker/Inputs/module-flags-pic-1-b.ll @@ -0,0 +1 @@ + diff --git a/test/Linker/Inputs/module-flags-pic-2-b.ll b/test/Linker/Inputs/module-flags-pic-2-b.ll new file mode 100644 index 00000000000..228e04ab4da --- /dev/null +++ b/test/Linker/Inputs/module-flags-pic-2-b.ll @@ -0,0 +1,3 @@ +!0 = metadata !{ i32 1, metadata !"PIC Level", i32 2 } + +!llvm.module.flags = !{!0} diff --git a/test/Linker/module-flags-pic-1-a.ll b/test/Linker/module-flags-pic-1-a.ll new file mode 100644 index 00000000000..bc4da9541ac --- /dev/null +++ b/test/Linker/module-flags-pic-1-a.ll @@ -0,0 +1,9 @@ +; RUN: llvm-link %s %p/Inputs/module-flags-pic-1-b.ll -S -o - | FileCheck %s + +; test linking modules with specified and default PIC levels + +!0 = metadata !{ i32 1, metadata !"PIC Level", i32 1 } + +!llvm.module.flags = !{!0} +; CHECK: !llvm.module.flags = !{!0} +; CHECK: !0 = metadata !{i32 1, metadata !"PIC Level", i32 1} diff --git a/test/Linker/module-flags-pic-2-a.ll b/test/Linker/module-flags-pic-2-a.ll new file mode 100644 index 00000000000..3ff9c8ffe83 --- /dev/null +++ b/test/Linker/module-flags-pic-2-a.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-link %s %p/Inputs/module-flags-pic-2-b.ll -S -o - 2> %t +; RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s + +; test linking modules with two different PIC levels + +!0 = metadata !{ i32 1, metadata !"PIC Level", i32 1 } + +!llvm.module.flags = !{!0} + +; CHECK-ERRORS: ERROR: linking module flags 'PIC Level': IDs have conflicting values