summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-06-16 23:13:00 +0000
committerRui Ueyama <ruiu@google.com>2015-06-16 23:13:00 +0000
commit6592ff8c93410d9f4560f3d4e8b744bcd6aceb04 (patch)
tree2dfb9543b6d6f6884653bf0e38a16c6e23bf9c5e
parentf7d163a8ea60b8bc039deaa15842893611577718 (diff)
downloadbcm5719-llvm-6592ff8c93410d9f4560f3d4e8b744bcd6aceb04.tar.gz
bcm5719-llvm-6592ff8c93410d9f4560f3d4e8b744bcd6aceb04.zip
COFF: Add miscellaneous boolean flags.
llvm-svn: 239864
-rw-r--r--lld/COFF/Config.h6
-rw-r--r--lld/COFF/Driver.cpp16
-rw-r--r--lld/COFF/Writer.cpp14
-rw-r--r--lld/test/COFF/options.test51
4 files changed, 84 insertions, 3 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index d40fdaaf271..9fe5777e865 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -51,6 +51,12 @@ public:
uint32_t MinorImageVersion = 0;
uint32_t MajorOSVersion = 6;
uint32_t MinorOSVersion = 0;
+ bool DynamicBase = true;
+ bool HighEntropyVA = true;
+ bool AllowBind = true;
+ bool NxCompat = true;
+ bool AllowIsolation = true;
+ bool TerminalServerAware = true;
};
extern Configuration *Config;
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 8e74a655771..b739ca97e88 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -226,8 +226,14 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) {
Config->EntryName = Arg->getValue();
// Handle /fixed
- if (Args->hasArg(OPT_fixed))
+ if (Args->hasArg(OPT_fixed)) {
+ if (Args->hasArg(OPT_dynamicbase)) {
+ llvm::errs() << "/fixed must not be specified with /dynamicbase\n";
+ return false;
+ }
Config->Relocatable = false;
+ Config->DynamicBase = false;
+ }
// Handle /machine
auto MTOrErr = getMachineType(Args.get());
@@ -318,6 +324,14 @@ bool LinkerDriver::link(int Argc, const char *Argv[]) {
return false;
}
+ // Handle miscellaneous boolean flags.
+ if (Args->hasArg(OPT_allowbind_no)) Config->AllowBind = false;
+ if (Args->hasArg(OPT_allowisolation_no)) Config->AllowIsolation = false;
+ if (Args->hasArg(OPT_dynamicbase_no)) Config->DynamicBase = false;
+ if (Args->hasArg(OPT_highentropyva_no)) Config->HighEntropyVA = false;
+ if (Args->hasArg(OPT_nxcompat_no)) Config->NxCompat = false;
+ if (Args->hasArg(OPT_tsaware_no)) Config->TerminalServerAware = false;
+
// Create a list of input files. Files can be given as arguments
// for /defaultlib option.
std::vector<StringRef> InputPaths;
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 811e3b760e1..4e23677a005 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -270,8 +270,18 @@ void Writer::writeHeader() {
PE->SizeOfStackCommit = Config->StackCommit;
PE->SizeOfHeapReserve = Config->HeapReserve;
PE->SizeOfHeapCommit = Config->HeapCommit;
- if (Config->Relocatable)
- PE->DLLCharacteristics = IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
+ if (Config->DynamicBase)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
+ if (Config->HighEntropyVA)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA;
+ if (!Config->AllowBind)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_BIND;
+ if (Config->NxCompat)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT;
+ if (!Config->AllowIsolation)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION;
+ if (Config->TerminalServerAware)
+ PE->DLLCharacteristics |= IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE;
PE->NumberOfRvaAndSize = NumberfOfDataDirectory;
if (OutputSection *Text = findSection(".text")) {
PE->BaseOfCode = Text->getRVA();
diff --git a/lld/test/COFF/options.test b/lld/test/COFF/options.test
new file mode 100644
index 00000000000..dfd884b97ae
--- /dev/null
+++ b/lld/test/COFF/options.test
@@ -0,0 +1,51 @@
+# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj
+
+# RUN: lld -flavor link /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BIND %s
+# RUN: lld -flavor link /allowbind /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BIND %s
+BIND-NOT: IMAGE_DLL_CHARACTERISTICS_NO_BIND
+
+# RUN: lld -flavor link /allowbind:no /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOBIND %s
+NOBIND: IMAGE_DLL_CHARACTERISTICS_NO_BIND
+
+# RUN: lld -flavor link /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ISO %s
+# RUN: lld -flavor link /allowisolation /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ISO %s
+ISO-NOT: IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION
+
+# RUN: lld -flavor link /allowisolation:no /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOISO %s
+NOISO: IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION
+
+# RUN: lld -flavor link /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ENT %s
+# RUN: lld -flavor link /highentropyva /out:%t.exe %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ENT %s
+ENT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
+
+# RUN: lld -flavor link /highentropyva:no %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOENT %s
+NOENT-NOT: IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
+
+# RUN: lld -flavor link %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s
+# RUN: lld -flavor link /nxcompat %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NXCOMPAT %s
+NXCOMPAT: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
+
+# RUN: lld -flavor link /nxcompat:no %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NONXCOMPAT %s
+NONXCOMPAT-NOT: IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
+
+# RUN: lld -flavor link %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=TSAWARE %s
+# RUN: lld -flavor link /tsaware %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=TSAWARE %s
+TSAWARE: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE
+
+# RUN: lld -flavor link /tsaware:no %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=NOTSAWARE %s
+NOTSAWARE-NOT: IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE
OpenPOWER on IntegriCloud