if (SectionCommand *cmd = readAssignment(tok))
v.push_back(cmd);
else
- v.push_back(readOutputSectionDescription(tok));
+ v.push_back(readOutputSectionDescription(unquote(tok)));
}
// If DATA_SEGMENT_RELRO_END is absent, for sections after DATA_SEGMENT_ALIGN,
};
}
if (tok == "ADDR") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
osec->usedInExpression = true;
return [=]() -> ExprValue {
};
}
if (tok == "ALIGNOF") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
return [=] {
checkIfExists(*osec, location);
return script->memoryRegions[name]->length;
}
if (tok == "LOADADDR") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
osec->usedInExpression = true;
return [=] {
return [=] { return e(); };
}
if (tok == "SIZEOF") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *cmd = &script->getOrCreateOutputSection(name)->osec;
// Linker script does not create an output section if its content is empty.
// We want to allow SIZEOF(.foo) where .foo is a section which happened to
--- /dev/null
+# REQUIRES: x86
+## Test quotation when specifying section names.
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
+# RUN: ld.lld -T a.t a.o
+# RUN: llvm-readelf -S -s a.out | FileCheck %s
+
+# CHECK: Name Type Address Off Size ES Flg Lk Inf Al
+# CHECK-NEXT: NULL 0000000000000000 000000 000000 00 0 0 0
+# CHECK-NEXT: .text {{.*}}
+# CHECK-NEXT: .data {{.*}}
+# CHECK: Num: Value Size Type Bind Vis Ndx Name
+# CHECK-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+# CHECK-NEXT: 1: 0000000000000009 0 NOTYPE GLOBAL DEFAULT ABS text_size
+# CHECK-NEXT: 2: 0000000000000009 0 NOTYPE GLOBAL DEFAULT ABS data_size
+
+#--- a.s
+ .text
+ nop
+
+ .data
+ .byte 0
+
+#--- a.t
+SECTIONS {
+ ## Check quoted section names are accepted and quotes are removed in the
+ ## output binary section name.
+ ##
+ ## Also check that functions taking a section name as parameter work correctly
+ ## when quoted section names are provided as inputs.
+ ".text" : AT(ADDR(".text")) {
+ LONG (ALIGNOF(".text"))
+ LONG (LOADADDR(".text"))
+ *(.text)
+ }
+ text_size = SIZEOF(".text");
+
+ ## Check that functions that take a section name can correctly match a quoted
+ ## section name input parameter against a non-quoted section definition.
+ .data : AT(ADDR(".data")) {
+ LONG (ALIGNOF(".data"))
+ LONG (LOADADDR(".data"))
+ *(.data)
+ }
+ data_size = SIZEOF(".data");
+}