mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
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
This commit is contained in:
parent
75da31ff15
commit
893f22f882
@ -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 <system_error>
|
||||
|
||||
@ -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.
|
||||
|
@ -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 {
|
||||
|
@ -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<PICLevel::Level>(cast<ConstantInt>(Val)->getZExtValue());
|
||||
}
|
||||
|
||||
void Module::setPICLevel(PICLevel::Level PL) {
|
||||
addModuleFlag(ModFlagBehavior::Error, "PIC Level", PL);
|
||||
}
|
||||
|
1
test/Linker/Inputs/module-flags-pic-1-b.ll
Normal file
1
test/Linker/Inputs/module-flags-pic-1-b.ll
Normal file
@ -0,0 +1 @@
|
||||
|
3
test/Linker/Inputs/module-flags-pic-2-b.ll
Normal file
3
test/Linker/Inputs/module-flags-pic-2-b.ll
Normal file
@ -0,0 +1,3 @@
|
||||
!0 = metadata !{ i32 1, metadata !"PIC Level", i32 2 }
|
||||
|
||||
!llvm.module.flags = !{!0}
|
9
test/Linker/module-flags-pic-1-a.ll
Normal file
9
test/Linker/module-flags-pic-1-a.ll
Normal file
@ -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}
|
10
test/Linker/module-flags-pic-2-a.ll
Normal file
10
test/Linker/module-flags-pic-2-a.ll
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user