Index: llvm/trunk/include/llvm/IR/Module.h =================================================================== --- llvm/trunk/include/llvm/IR/Module.h +++ llvm/trunk/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 @@ 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. Index: llvm/trunk/include/llvm/Support/CodeGen.h =================================================================== --- llvm/trunk/include/llvm/Support/CodeGen.h +++ llvm/trunk/include/llvm/Support/CodeGen.h @@ -30,6 +30,10 @@ enum Model { Default, JITDefault, Small, Kernel, Medium, Large }; } + namespace PICLevel { + enum Level { Default=0, Small=1, Large=2 }; + } + // TLS models. namespace TLSModel { enum Model { Index: llvm/trunk/lib/IR/Module.cpp =================================================================== --- llvm/trunk/lib/IR/Module.cpp +++ llvm/trunk/lib/IR/Module.cpp @@ -459,3 +459,16 @@ 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); +} Index: llvm/trunk/test/Linker/Inputs/module-flags-pic-1-b.ll =================================================================== --- llvm/trunk/test/Linker/Inputs/module-flags-pic-1-b.ll +++ llvm/trunk/test/Linker/Inputs/module-flags-pic-1-b.ll @@ -0,0 +1 @@ + Index: llvm/trunk/test/Linker/Inputs/module-flags-pic-2-b.ll =================================================================== --- llvm/trunk/test/Linker/Inputs/module-flags-pic-2-b.ll +++ llvm/trunk/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} Index: llvm/trunk/test/Linker/module-flags-pic-1-a.ll =================================================================== --- llvm/trunk/test/Linker/module-flags-pic-1-a.ll +++ llvm/trunk/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} Index: llvm/trunk/test/Linker/module-flags-pic-2-a.ll =================================================================== --- llvm/trunk/test/Linker/module-flags-pic-2-a.ll +++ llvm/trunk/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