COFF: Add /base option.
authorRui Ueyama <ruiu@google.com>
Fri, 29 May 2015 16:18:15 +0000 (16:18 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 29 May 2015 16:18:15 +0000 (16:18 +0000)
llvm-svn: 238567

lld/COFF/Driver.cpp
lld/COFF/Driver.h
lld/COFF/DriverUtils.cpp
lld/test/COFF/base.test [new file with mode: 0644]

index 7d98f04..2e6d70e 100644 (file)
@@ -126,6 +126,14 @@ bool link(int Argc, const char *Argv[]) {
   }
   Config->MachineType = MTOrErr.get();
 
+  // Handle /base
+  if (auto *Arg = Args->getLastArg(OPT_base)) {
+    if (auto EC = parseNumbers(Arg->getValue(), &Config->ImageBase)) {
+      llvm::errs() << EC.message() << "\n";
+      return false;
+    }
+  }
+
   // Parse all input files and put all symbols to the symbol table.
   // The symbol table will take care of name resolution.
   SymbolTable Symtab;
index e1a44b8..42372c3 100644 (file)
@@ -43,6 +43,10 @@ std::string findFile(StringRef Filename);
 // For /machine option.
 ErrorOr<MachineTypes> getMachineType(llvm::opt::InputArgList *Args);
 
+// Parses a string in the form of "<integer>[,<integer>]".
+std::error_code parseNumbers(StringRef Arg, uint64_t *Addr,
+                             uint64_t *Size = nullptr);
+
 // Create enum with OPT_xxx values for each option in Options.td
 enum {
   OPT_INVALID = 0,
index 738e4ed..6e97031 100644 (file)
@@ -128,6 +128,17 @@ ErrorOr<MachineTypes> getMachineType(llvm::opt::InputArgList *Args) {
   return IMAGE_FILE_MACHINE_UNKNOWN;
 }
 
+// Parses a string in the form of "<integer>[,<integer>]".
+std::error_code parseNumbers(StringRef Arg, uint64_t *Addr, uint64_t *Size) {
+  StringRef S1, S2;
+  std::tie(S1, S2) = Arg.split(',');
+  if (S1.getAsInteger(0, *Addr))
+    return make_dynamic_error_code(Twine("invalid number: ") + S1);
+  if (Size && !S2.empty() && S2.getAsInteger(0, *Size))
+    return make_dynamic_error_code(Twine("invalid number: ") + S2);
+  return std::error_code();
+}
+
 // Create OptTable
 
 // Create prefix string literals used in Options.td
diff --git a/lld/test/COFF/base.test b/lld/test/COFF/base.test
new file mode 100644 (file)
index 0000000..02535df
--- /dev/null
@@ -0,0 +1,10 @@
+# RUN: lld -flavor link2 /entry:main /out:%t.exe %p/Inputs/ret42.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=DEFAULT %s
+
+DEFAULT: ImageBase: 0x140000000
+
+# RUN: lld -flavor link2 /entry:main /out:%t.exe /base:0x280000000 \
+# RUN:   %p/Inputs/ret42.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=BASE %s
+
+BASE: ImageBase: 0x280000000